¿Opciones para el raspado de HTML? [cerrado]

406

Estoy pensando en probar Beautiful Soup , un paquete de Python para el raspado de HTML. ¿Hay otros paquetes de raspado de HTML que debería mirar? Python no es un requisito, en realidad también estoy interesado en escuchar sobre otros idiomas.

La historia hasta ahora:

carla
fuente
El enlace de Tag Soup está muerto.
Tapper7
HtmlUnit es una implementación completa del navegador Java que no puede diseccionar en partes (no puede descargar solo una página html y rasparla, descargará todos los archivos referidos, ejecutará scripts, etc.). Como tal, no creo que pertenezca aquí.
Mark Jeronimus
Stock Java puede caminar HTML con expresiones XPath, aunque no sin problemas. La parte del analizador (DocumentBuilder) se atasca en HTML incorrecto, y el HTML 100% correcto es bastante raro en la web. Por lo tanto, me gusta reemplazar el analizador con JTidy . En cuanto a XPath, XPathExpressionse puede usar el propio Java (que existe desde Java 1.5)
Mark Jeronimus

Respuestas:

64

El equivalente de Ruby World a Beautiful Soup es el Hpricot de why_the_lucky_stiff .

Joey deVilla
fuente
12
En estos días, la gente de Ruby se ha cambiado a Nokogiri para raspar.
Mark Thomas
44

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. Le permite manipular HTML mal formado como si fuera un XML bien formado, por lo que puede usar XPATH o simplemente iterar sobre nodos.

http://www.codeplex.com/htmlagilitypack

Jon Galloway
fuente
2
combina linq con él y parece más HTMLSQL, ¿no?
Bendice a Yahu el
3
Combine SharpQuery con él, ¡y se volverá como jQuery! code.google.com/p/sharp-query
mpen
1
HTML Agility Pack no puede estructurar correctamente el DOM para una serie de documentos HTML que he probado.
Ash Berlin-Taylor
37

BeautifulSoup es una excelente manera de raspar HTML. Mi trabajo anterior me hizo raspar mucho y desearí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, 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ás familiarizado 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í. Le digo que vaya con BeautifulSoup a menos que necesite velocidad y una huella de memoria más pequeña. Si encuentra un mejor analizador HTML en Python, hágamelo saber.

Cristian
fuente
21

Encontré que HTMLSQL es una forma ridículamente simple de screencrape. Lleva literalmente minutos obtener resultados con él.

Las consultas son súper intuitivas, como:

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

Ahora hay algunas otras alternativas que toman el mismo enfoque.

programador muerto
fuente
77
FYI, esta es una biblioteca PHP
Tristan Havelick
19

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

akaihola
fuente
18

Para Perl, hay WWW :: Mechanize.

andrewrk
fuente
16

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

  • mecanizar : similar a perl WWW:Mechanize. Le proporciona un objeto similar al navegador para que no interactúe con las páginas web.
  • lxml : enlace de Python 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 raspado y rastreo web de alto nivel. Se puede usar para escribir arañas, para minería de datos y para monitoreo y pruebas automatizadas
filippo
fuente
1
La biblioteca estándar de Python tiene un analizador HTML incorporado ... ¿por qué no usarlo? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare
11

La utilidad de creador de plantillas de Adrian Holovaty (de la fama de Django ) utiliza un enfoque muy interesante: le proporciona 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 eliminar cualquier otro contenido de texto sin formato. Lo he usado también para archivos PDF y HTML convertidos a texto sin formato (con pdftotext y lynx, respectivamente).

akaihola
fuente
¿Cómo conseguiste que Templatemaker funcionara para páginas HTML grandes? Descubrí que se bloquea cuando le doy algo no trivial.
hoju
Supongo que no he tenido páginas HTML grandes. Parece que no existen problemas archivados para ese problema en code.google.com/p/templatemaker/issues/list, por lo que probablemente sea apropiado enviar un caso de prueba allí. Sin embargo, no parece que Adrian esté manteniendo la biblioteca. Me pregunto qué usa hoy en día en EveryBlock, ya que seguramente hacen mucho trabajo de raspado.
akaihola
10

Sé y amo 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.
raiglstorfer
fuente
Lamentablemente, ni siquiera la versión básica es FOSS. Solo parece ser gratis como en la cerveza.
Andreas Kuckartz
9

Primero averiguaría si el (los) sitio (s) en cuestión proporcionan un servidor API o fuentes RSS para acceder a los datos que necesita.

GateKiller
fuente
8

Scraping Stack Overflow es especialmente fácil con Shoes y Hpricot .

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :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
Frank Krueger
fuente
8

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.

Jeff Atwood
fuente
7

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

Enrique
fuente
También puede usarlo para evaluar la ejecución de JavaScript si alguna vez lo necesita :)
David
5

Yo uso Hpricot en Ruby. Como 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 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 

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

Wolfbyte
fuente
5

He usado Beautiful Soup mucho con Python. Es mucho mejor que la comprobación de expresiones regulares, porque funciona como usar el DOM , incluso si el HTML está mal formateado. Puede encontrar rápidamente etiquetas HTML y texto 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 los contenidos 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 tan pobre antes de que la gente comenzara a validarla.

Peter Mortensen
fuente
5

Aunque fue diseñado para pruebas web .NET , he estado usando el marco WatiN para este propósito. Como 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 burdo, 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
JonnyGold
fuente
3

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

Agréguese a los siguientes módulos y elimine cualquier raspado.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
crojac
fuente
3

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 extraer el 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 .

Sin embargo, podría haber demasiado trabajo pesado para hacer con algo como este enfoque. No he mirado el módulo Mecanizar sugerido por otra respuesta, así que bien puedo hacerlo.

kaybenleroll
fuente
3

Bueno, si quieres hacerlo desde el lado del cliente usando solo un navegador, tienes 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 le sea útil. Haga clic en este enlace para ver un ejemplo en vivo que extrae las últimas noticias de Yahoo tennis .

Peter Mortensen
fuente
2

Probablemente ya tenga tanto, pero creo que esto es lo que está tratando de hacer:

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.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")
Conceder
fuente
2

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

Shawn Miller
fuente
2

Me gusta la función ImportXML (URL, XPath) de las hojas de cálculo de Google.

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

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

El complemento web de RapidMiner también es bastante fácil de usar. Puede hacer publicaciones, acepta cookies y puede configurar el agente de usuario .

Neil McGuigan
fuente
2

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 / DOM real es un salvavidas en páginas más complicadas (o malformadas).

kkubasik
fuente