scanner from definicion caracter java html parsing web-scraping

java - from - scanner char netbeans



AnĂ¡lisis HTML de Java (11)

El problema principal según lo indicado por los comentarios anteriores es HTML malformado, por lo que un limpiador html o un convertidor HTML-XML es imprescindible. Una vez que obtiene el código XML (XHTML), hay muchas herramientas para manejarlo. Puede obtenerlo con un simple controlador de SAX que extrae solo los datos que necesita o cualquier método basado en árbol (DOM, JDOM, etc.) que le permita incluso modificar el código original.

Aquí hay un código de muestra que utiliza el limpiador de HTML para obtener todos los DIV que usan una cierta clase e imprimen todo el contenido de texto dentro de él.

import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode; /** * @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom> */ public class TestHtmlParse { static final String className = "tags"; static final String url = "http://www.stackoverflow.com"; TagNode rootNode; public TestHtmlParse(URL htmlPage) throws IOException { HtmlCleaner cleaner = new HtmlCleaner(); rootNode = cleaner.clean(htmlPage); } List getDivsByClass(String CSSClassname) { List divList = new ArrayList(); TagNode divElements[] = rootNode.getElementsByName("div", true); for (int i = 0; divElements != null && i < divElements.length; i++) { String classType = divElements[i].getAttributeByName("class"); if (classType != null && classType.equals(CSSClassname)) { divList.add(divElements[i]); } } return divList; } public static void main(String[] args) { try { TestHtmlParse thp = new TestHtmlParse(new URL(url)); List divs = thp.getDivsByClass(className); System.out.println("*** Text of DIVs with class ''"+className+"'' at ''"+url+"'' ***"); for (Iterator iterator = divs.iterator(); iterator.hasNext();) { TagNode divElement = (TagNode) iterator.next(); System.out.println("Text child nodes of DIV: " + divElement.getText().toString()); } } catch(Exception e) { e.printStackTrace(); } } }

Estoy trabajando en una aplicación que raspa los datos de un sitio web y me preguntaba cómo debería obtener los datos. Específicamente, necesito información contenida en varias etiquetas div que usan una clase de CSS específica. Actualmente (para fines de prueba) solo estoy buscando

div class = "classname"

en cada línea de HTML: esto funciona, pero no puedo evitar sentir que hay una mejor solución.

¿Hay alguna manera agradable donde podría dar a una clase una línea de HTML y tener algunos buenos métodos como:

boolean usesClass(String CSSClassname); String getText(); String getLink();


El proyecto nu.validator es un excelente analizador de HTML de alto rendimiento que no reduce las esquinas de forma correcta.

El Validator.nu HTML Parser es una implementación del algoritmo de análisis HTML5 en Java. El analizador está diseñado para funcionar como un reemplazo directo para el analizador XML en aplicaciones que ya admiten contenido XHTML 1.x con un analizador XML y usan SAX, DOM o XOM para interactuar con el analizador. La funcionalidad de bajo nivel se proporciona para aplicaciones que deseen ejecutar su propio IO y admitir document.write () con scripts. El núcleo del analizador se compila en Google Web Toolkit y se puede traducir automáticamente a C ++. (La capacidad de traducción de C ++ se usa actualmente para portar el analizador para su uso en Gecko).


El proyecto HTMLParser ( http://htmlparser.sourceforge.net/ ) podría ser una posibilidad. Parece ser bastante decente en el manejo de HTML mal formado. El siguiente fragmento debería hacer lo que necesita:

Parser parser = new Parser(htmlInput); CssSelectorNodeFilter cssFilter = new CssSelectorNodeFilter("DIV.targetClassName"); NodeList nodes = parser.parse(cssFilter);



Hace varios años utilicé JTidy para el mismo propósito:

http://jtidy.sourceforge.net/

"JTidy es un puerto Java de HTML Tidy, un corrector de sintaxis HTML e impresora bonita. Al igual que su primo que no es Java, JTidy se puede utilizar como una herramienta para limpiar HTML mal formado y defectuoso. Además, JTidy proporciona una interfaz DOM a la documento que se está procesando, que efectivamente lo hace capaz de usar JTidy como un analizador DOM para HTML del mundo real.

JTidy fue escrito por Andy Quick, quien más tarde renunció al puesto de mantenedor. Ahora JTidy es mantenido por un grupo de voluntarios.

Se puede encontrar más información sobre JTidy en la página del proyecto JTidy SourceForge ".



No olvidemos a Jerry , su jQuery en Java: una biblioteca de Java rápida y concisa que simplifica el análisis, el recorrido y la manipulación de documentos HTML; incluye el uso de selectores css3.

Ejemplo:

Jerry doc = jerry(html); doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy");

Ejemplo:

doc.form("#myform", new JerryFormHandler() { public void onForm(Jerry form, Map<String, String[]> parameters) { // process form and parameters } });

Por supuesto, estos son solo algunos ejemplos rápidos para tener la sensación de cómo se ve todo.


Otra biblioteca que podría ser útil para el procesamiento HTML es jsoup. Jsoup intenta limpiar HTML mal formado y permite el análisis html en Java usando jQuery como la sintaxis del selector de etiquetas.

http://jsoup.org/


Puede que le interese TagSoup , un analizador HTML de Java capaz de manejar HTML mal formado. Los analizadores XML solo funcionarían en XHTML bien formado.


Si su HTML está bien formado, puede emplear fácilmente un analizador XML para hacer el trabajo por usted ... Si solo está leyendo, SAX sería ideal.