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.
- Calcule la profundidad de cada elemento html.
- Encuentra la profundidad con la mayor cantidad de contenido de texto.
- 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
idea interesante. Definitivamente no es algo que hubiera pensado de inmediato ...:] –
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
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? –