2011-08-28 7 views
7

si tuviera que identificar el texto principal de la página (por ejemplo, en una página de blog para identificar el contenido de la publicación) ¿qué haría? ¿Cuál crees que es la forma más sencilla de hacerlo?¿Alguna idea sobre cómo identificar el contenido principal de la página?

  1. Obtener el contenido de la página con curl
  2. usar Tal vez un analizador DOM para identificar los elementos de la página

Respuesta

6

Esa es una tarea bastante difícil pero comenzaría contando espacios dentro de los elementos DOM. Un signo revelador de contenido legible por humanos es espacios y períodos. La mayoría de los artículos parecen encapsular el contenido en las etiquetas de párrafo para que pueda ver todas las etiquetas p con n espacios y al menos un signo de puntuación.

También podría usar la cantidad de etiquetas de párrafo agrupadas dentro de un elemento ... Por lo tanto, si un div tiene N párrafo secundario, podría ser el contenido que desea extraer.

+0

idea interesante. Definitivamente no es algo que hubiera pensado de inmediato ...:] –

+0

Pensé en esto, traté de agrupar los párrafos por los padres. Pero en la práctica, puede haber otros párrafos que pueden distraer del contenedor principal. – Andrew

+0

En ese caso, probablemente tenga que usar algún tipo de heurística en el nombre/id del contenedor. ¿Tiene una url de la instancia que menciona? –

1

parece que la mejor respuesta es "depende". Como en, depende de cómo esté marcado el sitio en cuestión.

  1. Si el autor utiliza etiquetas "comunes", se podría buscar un elemento contenedor Identifican como "contenido" o "principal".
  2. Si el autor usa HTML5, en teoría debería poder consultar el elemento <article>, si se trata de una página con una sola "historia" que contar.
0

Depende mucho de la página. ¿Sabes algo sobre la estructura de la página de antemano? Si tiene suerte, podría proporcionar un feed RSS que podría usar o podría estar marcado con algunas de las nuevas etiquetas HTML5 como <article>, <section> etc. (que carry more semantic power than pre-HTML5 tags).

6

Existen algunos marcos que pueden archivar esto, uno de ellos es http://code.google.com/p/boilerpipe/ el cual usa algunas estadísticas. Algunas características que pueden detectar bloque HTML con contenido principal:

  1. p, etiquetas div
  2. cantidad de texto dentro/fuera
  3. cantidad de enlaces dentro/fuera (es decir, eliminar munus)
  4. un poco de CSS nombres de clase y id (frequntly los bloques tienen clases o ids con principal, main_block, contenido, etc.)
  5. relación entre el título y el texto dentro de contenido
2

Usted podría considerar:

  • Boilerpipe: "La biblioteca boilerpipe proporciona algoritmos para detectar y eliminar el excedente 'desorden' (repetitivo, plantillas) en todo el contenido textual principal 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 puede ampliarse fácilmente para configuraciones de problemas individuales. "
  • Ruby Readability:" La legibilidad de rubíes es una herramienta para extraer el contenido principal legible de una página web. Es un proyecto de legibilidad de Ruby port of arc90."
  • El Readability API:" Si desea acceder directamente al analizador de legibilidad, la API de contenido está disponible a pedido. Póngase en contacto con nosotros si está interesado. "
0

Recientemente me enfrenté al mismo problema Desarrollé un raspador de artículos de noticias y tuve que detectar el contenido principal de texto de las páginas del artículo. Muchos sitios de noticias muestran muchos otros contenido textual junto al "artículo principal" (por ejemplo, "leer a continuación", "puede que le interese"). Mi primer enfoque fue recopilar todo el texto entre las etiquetas <p>. Pero esto no funcionó porque había sitios de noticias que usaban el <p> para otros elementos como la navegación, 'leer más', etc también. hace algún tiempo me encontré con la Boilerpipe libary.

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

Eso sonó como la solución perfecta para mi problema, pero no fue así. Falló en muchos sitios de noticias, porque a menudo no era capaz de analizar todo el texto del artículo de noticias. No sé por qué, pero creo que el algoritmo boilerpipe no puede tratar con html mal escrito. Entonces, en muchos casos, simplemente devolvió una cadena vacía y no el contenido principal del artículo de noticias.

Después de esta mala experiencia traté de desarrollar mi propio algoritmo de "extractor de texto de artículo". La idea principal era dividir el HTML en diferentes profundidades, por ejemplo:

<html> 
<!-- depth: 1 --> 
<nav> 
    <!-- depth: 2 --> 
    <ul> 
     <!-- depth: 3 --> 
     <li><a href="/mhh">Site<!-- depth: 5 --></a></li> 
     <li><a href="/bla">Site<!--- depth: 5 ---></a></li> 
    </ul> 
</nav> 
<div id='text'> 
    <!--- depth: 2 ---> 
    <p>Thats the main content...<!-- depth: 3 --></p> 
    <p>main content, bla, bla bla ... <!-- depth: 3 --></p> 
    <p>bla bla bla interesting bla bla! <!-- depth: 3 --></p> 
    <p>whatever, bla... <!-- depth: 3 --></p> 
</div> 

</html> 

Como se puede ver, a Filer a cabo el excedente "desorden" con este algoritmo, cosas como elementos de navegación, "usted puede tener gusto" secciones , etc. debe estar en una profundidad diferente que el contenido principal. O en otras palabras: el exceso de "desorden" debe describirse con más (o menos) etiquetas html que el contenido textual principal.

  1. Calcule la profundidad de cada elemento html.
  2. Encuentra la profundidad con la mayor cantidad de contenido de texto.
  3. en Seleccionar todo el contenido textual con esta profundidad

Para prueba de este concepto escribí un Ruby script, lo que da buena, con la mayoría de los sitios de noticias. Además del script de Ruby, también desarrollé el textracto.com api que puedes usar gratis.

Saludos, David

0

he portado el código java boilerpipe original en una aplicación de rubí puro Ruby Boilerpipe también una versión jruby envolver el código original de Java Jruby Boilerpipe

Cuestiones relacionadas