Método de Python para extraer contenido (excluyendo la navegación) de una página HTML

Por supuesto, se puede analizar una página HTML utilizando cualquier número de analizadores de Python, pero me sorprende que no haya ningún script de análisis público para extraer contenido significativo (excluyendo barras laterales, navegación, etc.) de un documento HTML determinado .

Supongo que es algo así como recostackr elementos DIV y P y luego verificarlos para obtener una cantidad mínima de contenido de texto, pero estoy seguro de que una implementación sólida incluiría muchas cosas en las que no había pensado.

Prueba la biblioteca Beautiful Soup para Python. Tiene métodos muy simples para extraer información de un archivo html.

Tratar de extraer genéricamente datos de páginas web requeriría que las personas escriban sus páginas de una manera similar … pero hay un número casi infinito de formas para transmitir una página que se ve idéntica y mucho menos todas las combinaciones que puede tener para transmitir la misma información.

¿Hubo algún tipo de información en particular que intentaba extraer o algún otro objective final?

Puede intentar extraer cualquier contenido en los marcadores ‘div’ y ‘p’ y comparar los tamaños relativos de toda la información en la página. El problema entonces es que la gente probablemente agrupa la información en colecciones de ‘div’s y’ p’s (¡o al menos lo hacen si están escribiendo html bien formados!).

Tal vez si formara un árbol de cómo se relaciona la información (los nodos serían ‘p’ o ‘div o lo que sea y cada nodo contendría el texto asociado) podría hacer algún tipo de análisis para identificar la’ p ‘o’ más pequeña ‘ div ‘que abarca lo que parece ser la mayoría de la información ..?

[EDITAR] Tal vez, si puede integrarlo en la estructura de árbol que sugerí, podría usar un sistema de puntos similar al del asesino de spam. Definir algunas reglas que intentan clasificar la información. Algunos ejemplos:

+1 points for every 100 words +1 points for every child element that has > 100 words -1 points if the section name contains the word 'nav' -2 points if the section name contains the word 'advert' 

Si tiene muchas reglas de puntuación baja que se sumn cuando encuentra secciones más relevantes, creo que podría evolucionar hacia una técnica bastante potente y robusta.

[EDIT2] En cuanto a la legibilidad, ¡parece estar haciendo casi exactamente lo que acabo de sugerir! ¿Tal vez podría mejorarse para tratar de entender mejor las tablas?

Eche un vistazo a templatemaker: http://www.holovaty.com/writing/templatemaker/

Está escrito por uno de los fundadores de Django. Básicamente, lo alimenta con algunos ejemplos de archivos html y generará una “plantilla” que luego puede usar para extraer solo los bits que son diferentes (que generalmente es el contenido significativo).

Aquí hay un ejemplo de la página de códigos de Google :

# Import the Template class. >>> from templatemaker import Template # Create a Template instance. >>> t = Template() # Learn a Sample String. >>> t.learn('this and that') # Output the template so far, using the "!" character to mark holes. # We've only learned a single string, so the template has no holes. >>> t.as_text('!') 'this and that' # Learn another string. The True return value means the template gained # at least one hole. >>> t.learn('alex and sue') True # Sure enough, the template now has some holes. >>> t.as_text('!') '! and !'
# Import the Template class. >>> from templatemaker import Template # Create a Template instance. >>> t = Template() # Learn a Sample String. >>> t.learn('this and that') # Output the template so far, using the "!" character to mark holes. # We've only learned a single string, so the template has no holes. >>> t.as_text('!') 'this and that' # Learn another string. The True return value means the template gained # at least one hole. >>> t.learn('alex and sue') True # Sure enough, the template now has some holes. >>> t.as_text('!') '! and !' 

Puede usar la aplicación web boilerpipe para obtener y extraer contenido sobre la marcha.

(Esto no es específico de Python, ya que solo necesita enviar una solicitud GET de HTTP a una página en Google AppEngine).

Aclamaciones,

cristiano

Lo que es significativo y lo que no, depende de la semántica de la página. Si la semántica es horrible, su código no “adivinará” lo que es significativo. Utilizo la legibilidad, que usted vinculó en el comentario, y veo que en muchas páginas que bash leerlo no proporciona ningún resultado, no hablo de uno decente.

Si alguien pone el contenido en una tabla, estás condenado. Prueba la legibilidad en un foro phpbb y verás lo que quiero decir.

Si quieres hacerlo, ve con una expresión regular en

, o analiza el DOM.

Goose es solo la biblioteca para esta tarea. Para citar su README:

Goose intentará extraer la siguiente información:

  • Texto principal de un artículo.
  • Imagen principal del artículo.
  • Cualquier película de Youtube / Vimeo incluida en el artículo
  • Metadescripción
  • Etiquetas meta