2009-04-02 9 views
5

Tengo que analizar una serie de páginas web para importar datos en una aplicación. Cada tipo de página web proporciona el mismo tipo de datos. El problema es que el HTML de cada página es diferente, por lo que la ubicación de los datos varía. Otro problema es que el código HTML está mal formateado, por lo que es imposible utilizar un analizador similar a XML.¿Cómo se analiza un archivo HTML mal formateado?

Hasta el momento, la mejor estrategia que se me ocurre, es definir una plantilla para cada tipo de página, como:

Plantilla A:

<html> 
... 
    <tr><td>Table column that is missing a td 
     <td> Another table column</td></tr> 
    <tr><td>$data_item_1$</td> 
... 
</html> 

Plantilla B:

<html> 
... 
    <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr> 
... 
</html> 

De esta forma solo necesitaría un analizador único para todas las páginas, que compararía cada página con su plantilla y recuperaría $data_item_1$, $data_item_2$, etc. Aún así, es va a ser mucho trabajo. ¿Puedes pensar en una solución más simple? Cualquier biblioteca que pueda ayudar?

Gracias

Respuesta

8

Usted puede pasar fuente de la página a través ordenada para conseguir una página válida. Puede encontrar ordenado here . Tidy tiene enlaces para muchos lenguajes de programación. Después de hacer esto, puede usar su técnica de extracción de contenido/analizador favorita.

+0

Estoy totalmente de acuerdo. Primero pásalo por Tidy. –

+0

Algunas envolturas Tidy están disponibles aquí: http://users.rcn.com/creitzel/tidy.html –

2

Recomendaría Html Agility Pack. Tiene la capacidad de trabajar con HTML mal estructurado al mismo tiempo que le da Xml como la selección con Xpath. Aún tendría que crear plantillas de elementos o seleccionar usando diferentes selecciones y analizar, pero le hará pasar la mala estructura de la joroba.

+0

Esta es definitivamente una gran herramienta y vale la pena investigarla. El código fuente completo también se incluye con muchos ejemplos. – Rich

2

Como se mencionó here y en otras respuestas anteriores, Beautiful Soup puede analizar HTML extraño.

Beautiful Soup es un analizador de Python HTML/XML diseñado para proyectos de entrega rápida como screen-raspado. Tres características lo hacen poderoso:

  1. Beautiful Soup no se ahogará si le da un marcado incorrecto. Produce un árbol de análisis sintáctico que tiene aproximadamente tanto sentido como el documento original. Esto suele ser lo suficientemente bueno como para recopilar los datos que necesita y escaparse.
  2. Beautiful Soup proporciona algunos métodos simples y expresiones idiomáticas para navegar, buscar y modificar un árbol de análisis sintáctico: un conjunto de herramientas para diseccionar un documento y extraer lo que necesita. No es necesario crear un analizador personalizado para cada aplicación.
  3. Beautiful Soup convierte automáticamente documentos entrantes a Unicode y documentos salientes a UTF-8. No tiene que pensar en las codificaciones, a menos que el documento no especifique una codificación y Beautiful Soup no puede detectarlas automáticamente. Entonces solo tienes que especificar la codificación original.

Beautiful Soup analiza cualquier cosa que le dé, y hace las cosas del árbol transversal para usted. Puede decirle "Buscar todos los enlaces" o "Buscar todos los enlaces de la clase externalLink", o "Buscar todos los enlaces cuyas URL coinciden con" foo.com ", o" Encontrar el encabezado de la tabla que tiene texto en negrita, luego dar mí que el texto ".

+0

Bate en 22 segundos :-( –

1

uso de HTML5 como analizador html5lib.

A diferencia de HTML Tidy, esto le dará un manejo de errores muy similar a lo que hacen los navegadores.

+1

La especificación de HTML5 intenta estandarizar las reglas de análisis utilizadas por los navegadores para interpretar HTML mal formado. Hml5lib es una implementación abierta de la especificación en python, por lo que obtendrá * exactamente * el mismo comportamiento de análisis como navegadores compatibles con HTML5 si lo usa. Puede usarlo junto con lxml para obtener una funcionalidad similar a la sopa hermosa. –

0

Dependiendo de qué datos necesita extraer expresiones regulares podría ser una opción. Sé que mucha gente se estremecerá ante la idea de utilizar RegExes en datos estructurados, pero la verdad es que (como habrán descubierto) que una gran cantidad de HTML no está realmente bien estructurado y puede ser muy difícil de analizar.

Tuve un problema similar para ti, pero en mi caso solo quería una pieza de datos específica de la página que fuera fácil de identificar sin analizar el código HTML, así que un RegEx funcionaba muy bien.

Cuestiones relacionadas