example - new icon java
¿Cómo puedo extraer solo el contenido textual principal de una página HTML? (9)
Actualizar
Boilerpipe parece funcionar muy bien, pero me di cuenta de que no solo necesito el contenido principal porque muchas páginas no tienen un artículo, sino solo enlaces con una breve descripción de los textos completos (esto es común en los portales de noticias) y No quiero descartar estos cortos de texto.
Entonces, si una API hace esto, obtenga las diferentes partes textuales / los bloques que dividen cada uno de una manera que difiera de un solo texto (todo en un solo texto no es útil), informe.
La pregunta
Descargo algunas páginas de sitios aleatorios, y ahora quiero analizar el contenido textual de la página.
El problema es que una página web tiene una gran cantidad de contenido como menús, publicidad, banners, etc.
Quiero intentar excluir todo lo que no esté relacionado con el contenido de la página.
Tomando esta página como ejemplo, no quiero los menús de arriba ni los enlaces en el pie de página.
Importante: Todas las páginas son HTML y son páginas de varios sitios diferentes. Necesito sugerencia de cómo excluir estos contenidos.
En este momento, creo que al excluir el contenido dentro de las clases de "menú" y "banner" del HTML y las palabras consecutivas que parecen un nombre propio (primera letra mayúscula).
Las soluciones pueden basarse en el contenido del texto (sin etiquetas HTML) o en el contenido HTML (con las etiquetas HTML)
Edición: quiero hacer esto dentro de mi código Java, no en una aplicación externa (si esto es posible).
Probé una manera de analizar el contenido HTML descrito en esta pregunta: https://stackoverflow.com/questions/7035150/how-to-traverse-the-dom-tree-using-jsoup-doing-some-content-filtering
Echa un vistazo a Boilerpipe . Está diseñado para hacer exactamente lo que está buscando, eliminar el exceso de "desorden" (repetitivo, plantillas) alrededor del contenido textual principal de una página web.
Hay algunas maneras de introducir HTML en Boilerpipe y extraer HTML.
Puedes usar una URL :
ArticleExtractor.INSTANCE.getText(url);
Puedes usar un String :
ArticleExtractor.INSTANCE.getText(myHtml);
También hay opciones para usar un Reader , que abre una gran cantidad de opciones.
Está buscando lo que se conoce como "raspadores de HTML" o "raspadores de pantalla". Aquí hay un par de enlaces a algunas opciones para usted:
Mi primer instinto fue ir con tu método inicial de usar Jsoup. Al menos con eso, puede utilizar los selectores y recuperar solo los elementos que desee (es decir, Elements posts = doc.select("p");
y no tiene que preocuparse por los otros elementos con contenido aleatorio.
Sobre el tema de tu otra publicación, ¿fue el tema de los falsos positivos tu único razonamiento para alejarte de Jsoup? Si es así, ¿no podría simplemente ajustar el número de MIN_WORDS_SEQUENCE o ser más selectivo con sus selectores (es decir, no recuperar elementos div)?
Parece que hay un posible problema con Boilerpipe. ¿Por qué? Bueno, parece que es adecuado para ciertos tipos de páginas web, como las páginas web que tienen un solo cuerpo de contenido.
Por lo tanto, se puede clasificar crudamente las páginas web en tres tipos con respecto a Boilerpipe:
- una página web con un solo artículo (¡Boilerpipe digno!)
- una web con varios artículos, como la portada de los tiempos de Nueva York
- una página web que realmente no tiene ningún artículo, pero tiene algún contenido con respecto a los enlaces, pero también puede tener cierto grado de desorden.
Boilerpipe funciona en el caso # 1. Pero si uno está haciendo un montón de procesamiento de texto automatizado, entonces, ¿cómo "sabe" el software de qué tipo de página web está tratando? Si la página web en sí podría clasificarse en uno de estos tres grupos, entonces Boilerpipe podría aplicarse para el caso # 1. El caso # 2 es un problema, y el caso # 3 también es un problema: puede requerir un conjunto de páginas web relacionadas para determinar qué es el desorden y qué no lo es.
Puede filtrar la basura de html y luego analizar los detalles requeridos o usar las API del sitio existente. Consulte el siguiente enlace para filtrar el html, espero que ayude. http://thewiredguy.com/wordpress/index.php/2011/07/dont-have-an-apirip-dat-off-the-page/
Puede utilizar la api de textracto , extrae el texto principal del "artículo" y también tiene la oportunidad de extraer todo el contenido textual. Al "restar" estos textos, usted podría dividir los textos de navegación, previsualizar textos, etc. del contenido textual principal.
Puedes usar algunas libs como el goose . Funciona mejor en artículos / noticias. También puede verificar el código javascript que realiza una extracción similar a la de un ganso con el marcador de lectura de legibilidad
También puede usar boilerpipe para segmentar el texto en bloques de texto completo / no completo, en lugar de devolver uno de ellos (esencialmente, segmentos de boilerpipe primero, luego devuelve un String).
Suponiendo que tenga su HTML accesible desde un java.io.Reader, simplemente deje que boilerpipe segmente el HTML y clasifique los segmentos por usted:
Reader reader = ...
InputSource is = new InputSource(reader);
// parse the document into boilerpipe''s internal data structure
TextDocument doc = new BoilerpipeSAXInput(is).getTextDocument();
// perform the extraction/classification process on "doc"
ArticleExtractor.INSTANCE.process(doc);
// iterate over all blocks (= segments as "ArticleExtractor" sees them)
for (TextBlock block : getTextBlocks()) {
// block.isContent() tells you if it''s likely to be content or not
// block.getText() gives you the block''s text
}
TextBlock
tiene algunos métodos más emocionantes, ¡siéntete libre de jugar!
http://kapowsoftware.com/products/kapow-katalyst-platform/robo-server.php
Software propietario, pero hace que sea muy fácil de extraer desde páginas web y se integra bien con Java.
Utiliza una aplicación provista para diseñar archivos xml leídos por la API de roboserver para analizar páginas web. Los archivos xml se crean al analizar las páginas que desea analizar dentro de la aplicación proporcionada (bastante fácil) y aplicar reglas para recopilar los datos (en general, los sitios web siguen los mismos patrones). Puede configurar la programación, la ejecución y la integración de la base de datos utilizando la API de Java proporcionada.
Si está en contra de usar software y hacerlo usted mismo, sugeriría que no intente aplicar una regla a todos los sitios. Encuentre una manera de separar etiquetas y luego compile por sitio