html - tutorial - para que se usa elastic search
¿Manera "inteligente" de analizar y usar datos de sitios web? (12)
¿Has investigado el uso de una biblioteca de manipulación html? Ruby tiene algunos muy bonitos. por ejemplo, hpricot
Con una buena biblioteca, puede especificar las partes de la página que desee utilizando selectores CSS o xpath. Estos serían mucho más sólidos que usar expresiones regulares.
Ejemplo de la wiki de hpricot:
doc = Hpricot(open("qwantz.html"))
(doc/''div img[@src^="http://www.qwantz.com/comics/"]'')
#=> Elements[...]
Estoy seguro de que podrías encontrar una biblioteca que haga cosas similares en .NET o Python, etc.
¿Cómo analiza inteligentemente los datos devueltos por los resultados de búsqueda en una página?
Por ejemplo, digamos que me gustaría crear un servicio web que busque libros en línea mediante el análisis de los resultados de búsqueda de muchos sitios web de proveedores de libros. Pude obtener los datos HTML sin formato de la página y hacer algunas expresiones regulares para que los datos funcionen para mi servicio web, pero si alguno de los sitios web cambia el formato de las páginas, mi código se rompe.
RSS es de hecho una opción maravillosa, pero muchos sitios no tienen una búsqueda basada en XML / JSON.
¿Hay kits que ayuden a diseminar información en páginas automáticamente? Una loca idea sería tener un módulo de inteligencia artificial difusa para reconocer patrones en una página de resultados de búsqueda y analizar los resultados en consecuencia ...
Como han dicho otros, puede usar un analizador HTML que crea una representación DOM y la consulta con XPath / XQuery. Encontré un artículo muy interesante aquí: teoría y práctica de Java: Screen-raspado con XQuery - http://www.ibm.com/developerworks/xml/library/j-jtp03225.html
De acuerdo, usaré el método de sopa The Tag como se recomienda.
Como pregunta complementaria: ¿cómo diablos lo hacen esos sitios grandes de tipo raspador? ¡He visto un motor de búsqueda de empleo (por ejemplo, indeed.com) que escanea miles de sitios! ¿Es eso miles de expresiones regulares? Es casi imposible ...
El perejil en http://www.parselets.com parece bastante resbaladizo.
Le permite definir ''parslets'' usando JSON lo que usted define qué buscar en la página, y luego analiza esos datos por usted.
He hecho algo de esto recientemente, y aquí están mis experiencias.
Hay tres enfoques básicos:
- Expresiones regulares.
- Más flexible, fácil de usar con información poco estructurada y formatos cambiantes.
- Es más difícil hacer un análisis estructural / de etiqueta, pero es más fácil hacer una coincidencia de texto.
- Construido en la validación del formato de datos.
- Más difícil de mantener que otros, porque debe escribir una expresión regular para cada patrón que quiera usar para extraer / transformar el documento
- Generalmente más lento que 2 y 3.
- Funciona bien para listas de elementos formateados de forma similar
- Una buena herramienta de desarrollo / prueba de expresiones regulares y algunas páginas de muestra ayudarán. Tengo cosas buenas que decir sobre RegexBuddy aquí. Prueba su demo
- He tenido el mayor éxito con esto. La flexibilidad le permite trabajar con un código HTML sucio, brutal e in-the-wild.
- Convierta HTML a XHTML y use herramientas de extracción XML. Limpie HTML, conviértalo en XHTML legal y use XPath / XQuery / X-whatever para consultarlo como datos XML.
- Herramientas: TagSoup, HTMLTidy, etc.
- La calidad de la conversión de HTML a XHML es MUY importante y muy variable.
- La mejor solución si los datos que desea están estructurados por el diseño HTML y las etiquetas (datos en tablas HTML, listas, grupos DIV / SPAN, etc.)
- Más adecuado para obtener estructuras de enlace, tablas anidadas, imágenes, listas, etc.
- Debería ser más rápido que la opción 1, pero más lento que la opción 3.
- Funciona bien si el formato del contenido cambia / es variable, pero la estructura / diseño del documento no lo hace.
- Si los datos no están estructurados por etiquetas HTML, estás en problemas.
- Se puede usar con la opción 1.
- Generador de analizadores (ANTLR, etc.) : crea una gramática para analizar y analizar la página.
- No he intentado esto porque no era adecuado para mis páginas (desordenadas)
- Más adecuado si la estructura HTML es altamente estructurada, muy constante, regular y nunca cambia.
- Úselo si hay patrones fáciles de describir en el documento, pero no implican etiquetas HTML e implican recursiones o comportamientos complejos.
- No requiere entrada XHTML
- El rendimiento más rápido, generalmente
- Gran curva de aprendizaje, pero más fácil de mantener
He retocado con web harvest para la opción 2, pero creo que su sintaxis es un tanto extraña. Mezcla de XML y algún lenguaje de scripting pseudo Java. Si le gusta Java, y le gusta la extracción de datos de estilo XML (XPath, XQuery), puede ser el boleto para usted.
Editar: si usa expresiones regulares, asegúrese de usar una biblioteca con cuantificadores perezosos y grupos de captura. Las bibliotecas regex más antiguas de PHP carecen de estas, y son indispensables para hacer coincidir los datos entre las etiquetas de abrir / cerrar en HTML.
Intente buscar en Google para raspar la pantalla + el idioma que prefiera. Conozco varias opciones para Python, puede encontrar el equivalente para su idioma preferido:
- Hermosa sopa
- mecanizar: similar a perl WWW: Mecanizar. Te da un navegador como objeto para no interactuar con las páginas web
- lxml: enlace de pitón a libwww
- raspado: usa plantillas para raspar pedazos de páginas
- pyquery: le permite realizar consultas de jQuery en documentos xml / xhtml
- scrapy: un marco de rastreo de raspado y rastreo de alto nivel para escribir arañas para rastrear y analizar páginas web
Dependiendo del sitio web para raspar, es posible que necesite usar uno o más de los enfoques anteriores.
Lamentablemente, ''raspado'' es la solución más común, como dijiste al intentar analizar HTML desde sitios web. Puede detectar cambios estructurales en la página y marcar una alerta para que la corrija, por lo que un cambio al final no da como resultado datos vagos. Hasta que la web semántica sea una realidad, esa es prácticamente la única forma de garantizar un gran conjunto de datos.
Alternativamente, puede atenerse a pequeños conjuntos de datos proporcionados por las API. Yahoo está trabajando muy duro para proporcionar datos de búsqueda a través de API (ver YDN), creo que la API de Amazon abre una gran cantidad de datos de libros, etc., etc.
¡Espero que eso te ayude un poquito!
EDITAR: Y si usas PHP, recomendaría SimpleHTMLDOM
No es infalible, pero es posible que desee ver un analizador como Beautiful Soup . No encontrará mágicamente la misma información si el diseño cambia, pero es mucho más fácil que escribir expresiones regulares complejas. Tenga en cuenta que este es un módulo de Python.
No ha mencionado qué tecnología está utilizando. Si está analizando HTML, usaría una biblioteca de análisis:
- Hermosa sopa (Python)
- HTML Agility Pack (.NET)
También hay servicios web que hacen exactamente lo que usted dice, comerciales y gratuitos. Raspan sitios y ofrecen interfaces de servicios web.
Y un servicio web genérico que ofrece algunos raspados de pantalla es Yahoo Pipes. pregunta previa en ese
Si puede usar algo como Tag Soup , ese sería un buen lugar para comenzar. Entonces podrías tratar la página como una API XML, un poco.
¡Tiene una implementación Java y C ++, podría funcionar!
Sin una estructura HTML fija para analizar, odiaría mantener expresiones regulares para encontrar datos. Puede tener más suerte analizando el HTML a través de un analizador apropiado que construye el árbol. Luego selecciona elementos ... que serían más fáciles de mantener.
Obviamente, la mejor manera es obtener un resultado XML del motor con un marcado fijo que pueda analizar y validar. Creo que una biblioteca de análisis de HTML con algunas pruebas "en la oscuridad" del árbol producido sería más fácil de mantener que las expresiones regulares.
De esta forma, solo debes verificar <a href="blah" class="cache_link">...
convirtiéndote en <a href="blah" class="cache_result">...
o lo que sea.
En pocas palabras, desgranar elementos específicos con expresiones regulares sería desalentador. Un mejor enfoque es construir un modelo tipo DOM de la página y buscar ''anclajes'' a los datos de los caracteres en las etiquetas.
O envíe un correo electrónico al sitio donde se indique el caso de una API XML ... ¡es posible que lo contraten!
Usted no dice qué idioma está usando. En Java land puedes usar TagSoup y XPath para ayudar a minimizar el dolor. Hay un ejemplo de este blog (por supuesto, el XPath puede ser mucho más complicado según lo dicten sus necesidades):
URL url = new URL("http://example.com");
SAXBuilder builder = new SAXBuilder("org.ccil.cowan.tagsoup.Parser"); // build a JDOM tree from a SAX stream provided by tagsoup
Document doc = builder.build(url);
JDOMXPath titlePath = new JDOMXPath("/h:html/h:head/h:title");
titlePath.addNamespace("h","http://www.w3.org/1999/xhtml");
String title = ((Element)titlePath.selectSingleNode(doc)).getText();
System.out.println("Title is "+title);
Recomiendo externalizar las expresiones XPath para que tenga alguna medida de protección si el sitio cambia.
Aquí hay un ejemplo de XPath que definitivamente no estoy usando para screencrapear este sitio. De ninguna manera, no yo:
"//h:div[contains(@class,''question-summary'')]/h:div[@class=''summary'']//h:h3"