html web-scraping html-parsing html-content-extraction

Opciones para el raspado de HTML?



title css (30)

Estoy pensando en probar Beautiful Soup , un paquete de Python para raspar HTML. ¿Hay otros paquetes de raspado de HTML que debería estar viendo? Python no es un requisito, en realidad también me interesa escuchar sobre otros idiomas.

La historia hasta ahora:


¿Por qué nadie ha mencionado JSOUP todavía para Java? jsoup



Aunque fue diseñado para pruebas web en .NET , he estado usando el framework WatiN para este propósito. Dado que está basado en DOM, es bastante fácil capturar HTML, texto o imágenes. Recientemente, lo usé para volcar una lista de enlaces de una consulta de espacio de nombres de MediaWiki All Pages en una hoja de cálculo de Excel. El siguiente código de VB.NET es bastante tosco, pero funciona.

Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet) Dim PagesLink As Link For Each PagesLink In PagesIE.TableBodies(2).Links With MyWorkSheet .Cells(XLRowCounterInt, 1) = PagesLink.Text .Cells(XLRowCounterInt, 2) = PagesLink.Url End With XLRowCounterInt = XLRowCounterInt + 1 Next End Sub


BeautifulSoup es una gran manera de ir a raspar HTML. Mi trabajo anterior me hizo raspar mucho y me gustaría saber sobre BeautifulSoup cuando comencé. Es como el DOM con muchas más opciones útiles y es mucho más pitónico. Si quieres probar Ruby, ellos portaron BeautifulSoup llamándolo RubyfulSoup pero no se ha actualizado en mucho tiempo.

Otras herramientas útiles son HTMLParser o sgmllib.SGMLParser, que forman parte de la biblioteca estándar de Python. Estos funcionan mediante métodos de llamada cada vez que ingresa / sale de una etiqueta y encuentra texto html. Son como Expat si están familiarizados con eso. Estas bibliotecas son especialmente útiles si va a analizar archivos muy grandes y crear un árbol DOM sería largo y costoso.

Las expresiones regulares no son muy necesarias. BeautifulSoup maneja expresiones regulares por lo que si necesita su poder, puede utilizarlo allí. Digo que vaya con BeautifulSoup a menos que necesite velocidad y una huella de memoria más pequeña. Si encuentras un mejor analizador de HTML en Python, avísame.


Bueno, si desea que se haga desde el lado del cliente utilizando solo un navegador, tiene jcrawl.com . Después de haber diseñado su servicio de desguace desde la aplicación web ( http://www.jcrawl.com/app.html ), solo necesita agregar el script generado a una página HTML para comenzar a usar / presentar sus datos.

Toda la lógica de desguace ocurre en el navegador a través de JavaScript. Espero que les sea útil. Haga clic en este enlace para ver un ejemplo en vivo que extrae las últimas noticias del tenis de Yahoo .


Conozco y amo el Screen-Scraper .

Screen-Scraper es una herramienta para extraer datos de sitios web. Screen-Scraper automatiza:

* Clicking links on websites * Entering data into forms and submitting * Iterating through search result pages * Downloading files (PDF, MS Word, images, etc.)

Usos comunes:

* Download all products, records from a website * Build a shopping comparison site * Perform market research * Integrate or migrate data

Técnico:

* Graphical interface--easy automation * Cross platform (Linux, Mac, Windows, etc.) * Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.) * Runs on workstations or servers

Tres ediciones de screen-scraper:

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled. * Professional: Designed to be capable of handling most common scraping projects. * Basic: Works great for simple projects, but not nearly as many features as its two older brothers.


El desbordamiento de la pila de raspado es especialmente fácil con los Shoes y Hpricot .

require ''hpricot'' Shoes.app :title => "Ask ", :width => 370 do SO_URL = "http://.com" stack do stack do caption "What is your question?" flow do @lookup = edit_line "", :width => "-115px" button "Ask", :width => "90px" do download SO_URL + "/search?s=" + @lookup.text do |s| doc = Hpricot(s.response.body) @rez.clear() (doc/:a).each do |l| href = l["href"] if href.to_s =~ ///questions//[0-9]+/ then @rez.append do para(link(l.inner_text) { visit(SO_URL + href) }) end end end @rez.show() end end end end stack :margin => 25 do background white, :radius => 20 @rez = stack do end end @rez.hide() end end


El equivalente del mundo de Ruby a Beautiful Soup es por qué_el_fuerza de Hpricot .



En el mundo .NET, recomiendo el paquete de agilidad HTML. No es tan simple como algunas de las opciones anteriores (como HTMLSQL), pero es muy flexible. Te permite crear HTML mal formado como si fuera un XML bien formado, por lo que puedes usar XPATH o simplemente iterar sobre los nodos.

http://www.codeplex.com/htmlagilitypack


Encontré que HTMLSQL es una forma ridículamente simple de capturar pantallas. Se tarda literalmente minutos para obtener resultados con él.

Las consultas son superintuitivas, como:

SELECT title from img WHERE $class == ''userpic''

Ahora hay algunas otras alternativas que tienen el mismo enfoque.


He tenido cierto éxito con HtmlUnit , en Java. Es un marco simple para escribir pruebas unitarias en interfaces de usuario web, pero igualmente útil para el raspado de HTML.


He tenido resultados mixtos en .NET con SgmlReader, que originalmente fue iniciado por Chris Lovett y parece haber sido actualizado por MindTouch .


He usado LWP y HTML::TreeBuilder con Perl y los he encontrado muy útiles.

LWP (abreviatura de libwww-perl) le permite conectarse a sitios web y eliminar el código HTML, puede obtener el módulo aquí y el libro de O''Reilly parece estar en línea aquí .

TreeBuilder le permite construir un árbol a partir del HTML, y la documentación y la fuente están disponibles en HTML :: TreeBuilder - Analizador que construye un árbol de sintaxis HTML .

Puede que haya demasiado trabajo pesado aún para hacer con algo como este enfoque. No he mirado el WWW::Mechanize sugerido por otra respuesta, así que puedo hacerlo.


He usado Beautiful Soup mucho con Python. Es mucho mejor que la verificación de expresiones regulares, porque funciona como usar el DOM , incluso si el HTML está mal formateado. Puede encontrar rápidamente etiquetas y texto HTML con una sintaxis más simple que las expresiones regulares. Una vez que encuentre un elemento, puede iterar sobre él y sus elementos secundarios, lo que es más útil para comprender el contenido en código que con expresiones regulares. Desearía que Beautiful Soup existiera hace años, cuando tuve que hacer muchas capturas de pantalla, me habría ahorrado mucho tiempo y dolor de cabeza, ya que la estructura HTML era muy deficiente antes de que la gente comenzara a validarla.



La biblioteca lxml Python actúa como un enlace Pythonic para las bibliotecas libxml2 y libxslt. Me gusta especialmente su compatibilidad con XPath y la impresión de la estructura XML en memoria. También es compatible con el análisis de HTML roto. Y no creo que puedas encontrar otras bibliotecas / enlaces de Python que analicen XML más rápido que lxml.


La utilidad templatemaker de Adrian Holovaty (de la fama de Django ) utiliza un enfoque muy interesante: le das variaciones de la misma página y "aprende" dónde están los "agujeros" para los datos variables. No es específico de HTML, por lo que también sería bueno para raspar cualquier otro contenido de texto simple. Lo he usado también para PDF y HTML convertido a texto plano (con pdftotext y lynx, respectivamente).


Me gusta la función ImportXML (URL, XPath) de Google Spreadsheets.

Repetirá celdas en la columna si su expresión XPath devuelve más de un valor.

Puede tener hasta 50 funciones importxml() en una hoja de cálculo.

El complemento web de RapidMiner también es bastante fácil de usar. Puede hacer publicaciones, aceptar cookies y puede configurar el user-agent .



Otra opción para Perl sería Web::Scraper que se basa en Ruby''s Scrapi . En pocas palabras, con una sintaxis agradable y concisa, puede obtener un raspador robusto directamente en las estructuras de datos.


Para Perl, hay WWW :: Mecanizar.


Primero averiguaría si los sitios en cuestión proporcionan un servidor API o fuentes RSS para acceder a los datos que necesita.


Probablemente ya tengas mucho, pero creo que esto es lo que estás tratando de hacer:

from __future__ import with_statement import re, os profile = "" os.system(''wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://.com/users/30/myProfile.html'') with open("myProfile.html") as f: for line in f: profile = profile + line f.close() p = re.compile(''summarycount">(/d+)</div>'') #Rep is found here print p m = p.search(profile) print m print m.group(1) os.system("espeak /"Rep is at " + m.group(1) + " points/"" os.remove("myProfile.html")


Python tiene varias opciones para raspar HTML además de Beatiful Soup. Aquí hay algunos otros:

  • Mechanize : similar a perl WWW:Mechanize . Te da un objeto similar a un navegador para interactuar con páginas web
  • lxml : Python lxml a libwww . Admite varias opciones para recorrer y seleccionar elementos (por ejemplo, selección de XPath y CSS)
  • scrapemark : biblioteca de alto nivel que usa plantillas para extraer información de HTML.
  • pyquery : le permite hacer jQuery como consultas en documentos XML.
  • Scrapy : un marco de alto nivel de rastreo y rastreo web. Puede usarse para escribir spiders, para minería de datos y para monitoreo y pruebas automatizadas

Serías un tonto si no usaras Perl ... Aquí vienen las llamas ...

Deshazte de los siguientes módulos y ginsu cualquier raspadura alrededor.

use LWP use HTML::TableExtract use HTML::TreeBuilder use HTML::Form use Data::Dumper



También he tenido un gran éxito al usar Jaxer + jQuery de Aptana para analizar páginas. No es tan rápido o "similar a un script" en la naturaleza, pero los selectores jQuery + JavaScript real / DOM son un salvavidas en páginas más complicadas (o mal formadas).


Yo uso Hpricot en Ruby. A modo de ejemplo, este es un fragmento de código que utilizo para recuperar todos los títulos de libros de las seis páginas de mi cuenta de HireThings (ya que no parecen proporcionar una sola página con esta información):

pagerange = 1..6 proxy = Net::HTTP::Proxy(proxy, port, user, pwd) proxy.start(''www.hirethings.co.nz'') do |http| pagerange.each do |page| resp, data = http.get "/perth_dotnet?page=#{page}" if resp.class == Net::HTTPOK (Hpricot(data)/"h3 a").each { |a| puts a.innerText } end end end

Es bastante completo. Todo lo que viene antes de esto son las importaciones de la biblioteca y la configuración de mi proxy.