2009-04-28 5 views
8

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

Supongo que es algo así como recopilar elementos DIV y P y luego revisarlos para 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.

+1

Este JS guión para el bookmarklet legibilidad parece que funciona sorprendentemente bien: http://lab.arc90.com/experiments/readability/js/readability.js – jamtoday

+0

¿Qué quiere decir por "significativo"? ¿Qué regla puede usar un programa para distinguir "significativo" de lo que se supone que debe excluirse? ¿Funciona esta regla universalmente? –

+0

Por significativo, simplemente me refiero al tipo de contenido que extrae la legibilidad. Obviamente, esto no funcionaría bien en algunos tipos de sitios, pero en su mayoría busco blogs y sitios de noticias en los que desee extraer las más grandes cantidades de texto. – jamtoday

Respuesta

5

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

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

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

Puede intentar extraer cualquier contenido en marcadores 'div' y 'p' y comparar los tamaños relativos de toda la información en la página. El problema entonces es que las personas probablemente agrupen información en colecciones de 'div' y 'p' (o al menos lo hacen si escriben html bien formado).

Tal vez si formara un árbol de cómo se relaciona la información (los nodos serían la '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 el más pequeño' p 'o' div 'que abarca lo que parece ser la mayoría de la información ..?

[EDITAR] Tal vez si puede conseguirlo en la estructura de árbol que sugerí, podría utilizar un sistema de puntos similar al de spam assassin. Define 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 usted tiene una gran cantidad de reglas de puntuación baja que suman cuando encuentre más relevante mirando secciones, creo que podría convertirse en una técnica bastante potente y robusto.

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

+0

Esto es lo que tenía en mente, pero estoy Todavía me sorprende que no haya una sola biblioteca o un complemento de BeautifulSoup que haga esto para usted, ya que me imagino que la extracción de contenido de un HTML podría usar este tipo de reglas sin variación> 90% del tiempo ... – jamtoday

+0

realmente depende de lo que estás buscando; Casi todos y cada uno de los raspadores que he escrito han estado buscando pequeños fragmentos de información en lugar de los borrones más grandes de texto (que a menudo son información genérica sobre el sitio). –

+0

Una nota adicional interesante: la secuencia de comandos de "legibilidad" basada en JavaScript también extrae contenido (ot, más bien, selección). También se puede despojar de ideas/algoritmo. Aunque no es completamente exitoso. – HoverHell

1

Lo que es significativo y lo que no, depende de la semántica de la página. Si la semántica es mala, tu código no "adivinará" lo que es significativo. Utilizo la legibilidad, que vinculó en el comentario, y veo que en muchas páginas que trato de leer no proporciona ningún resultado, no habla de uno decente.

Si alguien pone el contenido en una tabla, está condenado. Prueba la legibilidad en un foro de phpBB ya verás a qué me refiero.

Si desea hacerlo, vaya con una expresión regular en <p></p>, o analice el DOM.

+0

Si mira la fuente, verá que incluso StackOverflow usa tablas para el diseño en algunos lugares. –

+0

pero tiene texto en los párrafos !! no en td solo como foros de mierda !! y no hay necesidad de gritar eso !! – zalew

+0

Muy cierto, me sorprendió que SO utilizara tablas para el diseño en absoluto. Claro, las tablas a menudo se renderizan de forma más confiable pero css y más 'div's y' p's serían una mejor solución para la legibilidad (los lectores de pantalla tienen más problemas con las tablas, por ejemplo) .. –

4

Tenga una mirada en templatemaker: http://www.holovaty.com/writing/templatemaker/

Está escrito por uno de los fundadores de Django. Básicamente le das algunos ejemplos de archivos html y generará una "plantilla" que luego puedes usar para extraer solo los bits que son diferentes (que generalmente es el contenido significativo).

He aquí un ejemplo de la google code page:

 

# Import the Template class. 
>>> from templatemaker import Template 

# Create a Template instance. 
>>> t = Template() 

# Learn a Sample String. 
>>> t.learn('<b>this and that</b>') 

# 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('!') 
'<b>this and that</b>' 

# Learn another string. The True return value means the template gained 
# at least one hole. 
>>> t.learn('<b>alex and sue</b>') 
True 

# Sure enough, the template now has some holes. 
>>> t.as_text('!') 
'<b>! and !</b>' 
 
3

Es posible utilizar el boilerpipe Web application a buscar y extraer el contenido sobre la marcha.

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

Saludos,

cristianos

+0

en el primer vistazo rápido, esto se ve muy bien. sería genial si hubiera algo exactamente así como una biblioteca. ¡Gracias! –

0

Goose es sólo la biblioteca para esta tarea. Para citar a su README:

ganso tratará de extraer la siguiente información:

  • Texto principal de un artículo
  • La imagen principal del artículo
  • Cualquier película de Youtube/Vimeo incrustados en el artículo
  • Meta descripción
  • etiquetas Meta
Cuestiones relacionadas