2008-08-28 16 views
5

Estoy intentando buscar algo de HTML de varios blogs y he notado que diferentes proveedores usan la misma etiqueta de diferentes maneras.La mejor manera de obtener una etiqueta HTML variable

Por ejemplo, aquí hay dos principales proveedores que utilizan la etiqueta meta generador de nombres de forma diferente:

  • Blogger: <meta content='blogger' name='generator'/> (contenido primero, nombre posteriores y, sí, comillas simples!)
  • WordPress: <meta name="generator" content="WordPress.com" /> (nombre primero, contenido posterior)

¿Hay alguna manera de extraer el valor del contenido para todos los casos (comillas simples/dobles, primero/último en la fila)?

P.S. Aunque estoy usando Java, la respuesta probablemente ayude a más personas si es para expresiones regulares en general.

Respuesta

14

La respuesta es: no utilizan expresiones regulares.

En serio. Use un analizador SGML o un analizador XML si sabe que es XML válido (probablemente casi nunca sea verdadero). Usted absolutamente arruinará y perderá toneladas de tiempo tratando de hacerlo bien. Solo usa lo que ya está disponible.

2

Estas diferencias no son realmente importantes según el estándar XHTML.

En otras palabras, son exactamente lo mismo.

Además, si reemplaza las comillas dobles con comillas simples, sería lo mismo.

La forma típica de 'normalizar' un documento xml es cortarlo usando alguna API que trate el documento como su representación Infoset. Ambas API de estilo DOM y SAX funcionan de esa manera.

Si quieres analizarlos a mano (o con un RegEx) tienes que replicar todas esas cosas en tu código y, en mi opinión, eso no es práctico.

3

En realidad, probablemente debería usar algún tipo de analizador de HTML donde puede inspeccionar cada nodo (y por lo tanto los atributos de nodo) en el DOM de la página. No he utilizado ninguno de estos por un tiempo, así que no sé muy bien los pros y contras, pero aquí hay una lista http://java-source.net/open-source/html-parsers

2

Nota: comillas simples (incluso sin comillas, si el valor no contiene un espacio) es válido según the W3C HTML spec. Cita:

Por defecto, SGML requiere que todos los valores de atributos estar delimitados ya sea utilizando comillas dobles (decimal ASCII 34) o comillas simples (decimal ASCII 39) ... En ciertos casos, los autores pueden especificar el valor de un atributo sin comillas

Además, no olvide que el orden de los atributos se puede invertir y que otros atributos pueden aparecer en la etiqueta.

0

De acuerdo, ya que está buscando un lenguaje independiente, puede probar un REGEX como /<meta\s.*content=.*>/ y tomar el resultado de eso y analizar los valores específicos que está buscando. No soy de ninguna manera un experto en REGEX, así que probablemente haya una mejor manera, pero al usar la herramienta en http://www.codehouse.com/webmaster_tools/regex/ coincidí con las dos cadenas que proporcionó.

1

Es posible que desee dar una oportunidad al Java HTMLEditorKit. Es fácil experimentar para ver si el análisis proporciona lo que estás buscando.

0

Si tiene que usar expresiones regulares, aquí es una expresión regular para obtener sólo la parte de contenido:

content\s*=\s*['"].*?['"] 

vuelve

content = "blogger" 

y

content='Worpress.com' 

respectivamente. No soy un experto en expresiones regulares, pero los obtiene cuando se le dan ejemplos en regexpal.

Una vez que consigues eso, puedes obtener todo lo que encuentres entre comillas, como prefieras, ya sea otra expresión regular (que es inmoral en ese punto) o simplemente hacer un bucle sobre los personajes.

0

Si utiliza Java, puede consultar tagsoup, que es un analizador compatible con SAX para "[analizar] HTML tal como se encuentra en la naturaleza".

Cuestiones relacionadas