2011-01-12 15 views
38

Dada la página web de un artículo de noticias (de cualquier fuente de noticias importante como times o bloomberg), quiero identificar el contenido del artículo principal en esa página y arrojar los otros elementos misceláneos como anuncios, menús, barras laterales, comentarios de los usuarios.Web scraping - cómo identificar contenido principal en una página web

¿Cuál es una forma genérica de hacer esto que funcionará en la mayoría de los principales sitios de noticias?

¿Cuáles son algunas buenas herramientas o bibliotecas para la minería de datos? (preferiblemente basado en python)

+5

ver cómo se implementa 'Readability' marcador http://lab.arc90.com/experiments/readability/ – jfs

+0

Un el navegador que hace esto sería una gran amenaza para los anuncios en línea. –

+2

el código del bookmarklet original está aquí: http://code.google.com/p/arc90labs-readability/source/browse/ 'Readability' ahora es un servicio y su código no está disponible. – lsh

Respuesta

4

No hay forma de hacer esto que garantice que funciona, pero una estrategia que puede utilizar es tratar de encontrar el elemento con el texto más visible dentro de él.

4

Puede ser más útil extraer los canales RSS (<link type="application/rss+xml" href="..."/>) en esa página y analizar los datos en el canal de información para obtener el contenido principal.

+0

NB: para alimentaciones ATOM 'type =" application/atom + xml "' – nedk

+0

Una buena idea, pero esto puede ser impredecible, ya que muchos feeds solo incluyen un resumen del artículo. Lo cual es comprensible, ya que el objetivo de la mayoría de los sitios de noticias es hacer que vea anuncios, que generalmente no encontrará dentro de un lector de RSS. – Cerin

0

No trataría de rasparlo de la página web, demasiadas cosas podrían estropearlo, pero en cambio ver qué sitios web publican feeds RSS. Por ejemplo, de The Guardian RSS tiene la mayor parte del texto de sus artículos de fondo:

http://feeds.guardian.co.uk/theguardian/rss

No sé si los tiempos (The Times de Londres, no NY) tiene uno porque es detrás de un muro de pago. Buena suerte con eso ...

+0

La mayoría de los canales RSS que he visto solo tienen resúmenes breves de los artículos completos. – kefeizhou

27

Hay varias maneras de hacerlo, pero ninguno funcionará siempre. Aquí están los dos más fáciles:

  • si se trata de un conjunto finito conocido de los sitios web en su rascador convertir cada URL de la URL normal a la url de impresión para un sitio determinado (en realidad no puede ser generalizado a través de sitios)
  • Utilice el algoritmo de legibilidad arc90 (la implementación de referencia está en javascript) http://code.google.com/p/arc90labs-readability/. La versión corta de este algoritmo es que busca divs con etiquetas p dentro de ellos. No funcionará para algunos sitios web, pero en general es bastante bueno.
+3

+1 por legibilidad. Dado que la legibilidad funciona mejor para las páginas de artículos en lugar de las páginas de inicio, funcionaría mejor cuando se analiza un feed RSS para las URL de los artículos. – nedk

+1

Debería haber agregado enlaces a los puertos de python del algoritmo de legibilidad: http://github.com/search?type=Repositories&language=python&q=readability&repo=&langOverride=&x=22&y=9&start_value=1 – gte525u

+0

Me pregunto por qué no lo hice. t descubre esto antes. Fue excelente, en comparación con los métodos anteriores de ad-hocs que desarrollé yo mismo. – Pankaj

3

Otra posibilidad de separar el contenido "real" del ruido es por measuring HTML density de las partes de una página HTML.

Necesitará un poco de experimentación con los umbrales para extraer el contenido "real", y supongo que podría mejorar el algoritmo aplicando heurísticas para especificar los límites exactos del segmento HTML después de haber identificado el contenido interesante.

Actualización: Acabo de enterarme de que la URL anterior no funciona en este momento; here is an alternative link a una versión en caché de archive.org.

8

Hace un tiempo escribí un simple Python script solo para esta tarea. Utiliza una heurística para agrupar bloques de texto en función de su profundidad en el DOM. El grupo con más texto se supone que es el contenido principal. No es perfecto, pero funciona generalmente bien para los sitios de noticias, donde el artículo generalmente es la agrupación más grande de texto, incluso si está dividido en varias etiquetas div/p.

tendrá que utilizar la secuencia de comandos como: python webarticle2text.py <url>

+0

el enlace ya no funciona –

+0

@ MPękalski, gracias por avisarme. He actualizado el enlace. – Cerin

8

Diffbot ofrece un servicio gratuito (10.000 URL) de la API de hacer eso, no saben si ese enfoque es lo que está buscando, pero podría ayudar a alguien http://www.diffbot.com/

+0

Bien, he estado pensando por un tiempo acerca de construir algo así yo =) –

6

Para una solución en Java echar un vistazo a https://code.google.com/p/boilerpipe/:

El La biblioteca boilerpipe proporciona algoritmos para detectar y eliminar el exceso de "desorden" (repetitivo, plantillas) alrededor del contenido principal de texto de una página web.

La biblioteca ya proporciona estrategias específicas para tareas comunes (por ejemplo, extracción de artículos de noticias) y también se puede ampliar fácilmente para configuraciones de problemas individuales.

Pero también hay una envoltura alrededor de este pitón disponible aquí:

https://github.com/misja/python-boilerpipe

Cuestiones relacionadas