Opciones para el raspado HTML? [cerrado]


Estoy pensando en probar Beautiful Soup, un paquete Python para raspado HTML. ¿Hay algún otro paquete de raspado HTML que debería estar mirando? Python no es un requisito, en realidad estoy interesado en escuchar acerca de otros idiomas también.

La historia hasta ahora:

Author: carla, 2008-08-06

30 answers

El equivalente del mundo Ruby a la Sopa Hermosa es why_the_lucky_stiff Hpricot.

 54
Author: Joey deVilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-04 09:56:45

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

Http://www.codeplex.com/htmlagilitypack

 39
Author: Jon Galloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-07 18:38:30

BeautifulSoup es una gran manera de hacer scraping HTML. Mi trabajo anterior me tenía haciendo un montón de raspado y me gustaría saber sobre BeautifulSoup cuando empecé. 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 un tiempo.

Otras herramientas útiles son HTMLParser o sgmllib.SGMLParser que forman parte de la biblioteca estándar de Python. Estos funcionan llamando a los métodos cada vez que ingrese/salga de una etiqueta y encuentre texto html. Son como expatriados 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í. Yo digo que vaya con BeautifulSoup a menos que necesite velocidad y una menor huella de memoria. Si encuentras un mejor HTML analizador de Python, házmelo saber.

 32
Author: Cristian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-07 18:18:59

Encontré que HTMLSQL es una forma ridículamente simple de crear una pantalla. Toma literalmente minutos obtener resultados con él.

Las consultas son súper intuitivas, como:

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

Ahora hay otras alternativas que adoptan el mismo enfoque.

 18
Author: deadprogrammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-07 18:31:17

La biblioteca Python lxml actúa como un enlace pitónico para las bibliotecas libxml2 y libxslt. Me gusta particularmente su soporte XPath y la impresión bonita 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.

 16
Author: akaihola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-14 12:38:48

Para Perl, está WWW::Mechanize.

 15
Author: andrewrk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 23:37:44

'Simple HTML DOM Parser' es una buena opción para PHP, si está familiarizado con los selectores jQuery o JavaScript, entonces se encontrará como en casa.

Encuéntralo aquí

También hay una entrada de blog sobre esto aquí.

 11
Author: Orange Box,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-31 19:39:57

¿Por qué nadie ha mencionado todavía JSOUP para Java? http://jsoup.org /

 11
Author: cookie_monster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-10 19:42:50

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

  • mecanizar: similar a perl WWW:Mechanize. Le da un navegador como objeto para ineract con páginas web
  • lxml: enlace de Python a libwww. Soporta varias opciones para recorrer y seleccionar elementos (por ejemplo, XPath y CSS selection)
  • scrapemark : biblioteca de alto nivel que utiliza plantillas para extraer información de HTML.
  • pyquery: permite realizar consultas similares a jQuery en documentos XML.
  • scrapy: un framework de raspado y rastreo web de alto nivel. Se puede utilizar para escribir arañas, para la minería de datos y para el monitoreo y pruebas automatizadas
 10
Author: filippo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-24 15:26:54

La utilidad templatemaker de Adrian Holovaty (de Django fame) usa 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 sería bueno para raspar cualquier otro contenido de texto plano también. Lo he usado también para archivos PDF y HTML convertidos a texto plano (con pdftotext y lynx, respectivamente).

 9
Author: akaihola,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-18 20:13:40

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

 7
Author: GateKiller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 21:11:29

Conozco y amo Screen-Scraper .

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

* 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écnica:

* 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.
 7
Author: raiglstorfer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:10:05

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

 6
Author: Jeff Atwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:05:58

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
 5
Author: Frank Krueger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-22 10:20:38

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

 5
Author: Henry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-31 12:09:33
 5
Author: mvark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-02 12:15:28

Otra herramienta para. NET es MhtBuilder

 4
Author: GeekyMonkey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-13 12:58:01

También existe esta solución: netty HttpClient

 4
Author: jbst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-02 18:40:07

Uso Hpricot en Ruby. Como ejemplo, este es un fragmento de código que uso 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 

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

 4
Author: Wolfbyte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:15:19

He usado Sopa Hermosa 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 hijos, lo que es más útil para comprender el contenido del código que con expresiones regulares. Ojalá existiera una sopa hermosa hace años cuando tuve que hacer un mucho screenscraping me 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.

 4
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:24:20

Aunque fue diseñado para . NET web-testing, he estado usando el WatiN framework 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 MediaWiki All Pages en una hoja de cálculo de Excel. Lo siguiente VB.NET el fragmento de código es bastante crudo, 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
 4
Author: JonnyGold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:25:54

Implementaciones del algoritmo de análisis HTML5 : html5lib (Python, Ruby), Validator.nu HTML Parser (Java, JavaScript; C++ en desarrollo), Hubbub (C), Twintsam (C#; próximo).

 3
Author: hsivonen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 20:53:21

Sería un tonto no usar Perl.. Aquí vienen las llamas..

Hueso en los siguientes módulos y ginsu cualquier raspado alrededor.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
 3
Author: 2 revs, 2 users 67%crojac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-27 16:03:56

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 raspar el HTML, puede obtener el módulo aquí y el libro O'Reilly parece estar en línea aquí.

TreeBuilder le permite construir un árbol a partir del HTML, y la documentación y el código fuente están disponibles en HTML:: TreeBuilder-Parser que construye una sintaxis HTML árbol.

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

 3
Author: kaybenleroll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:22:42

En Java, puedes usar TagSoup.

 3
Author: Peter Hilton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-27 10:18:26

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 resulte útil. Haga clic en este enlace para ver un ejemplo en vivo que extrae las últimas noticias de Yahoo tennis .

 3
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-31 17:07:45

Probablemente ya tengas tanto, 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://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")
 2
Author: Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-05 22:58:06

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

 2
Author: Shawn Miller,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-27 18:49:53

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 plugin web de RapidMiner también es bastante fácil de usar. Puede hacer publicaciones, acepta cookies y puede configurar el agente de usuario .

 2
Author: Neil McGuigan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-27 16:16:50

También he tenido un gran éxito usando Jaxer + jQuery de Aptana para analizar páginas. No es tan rápido o 'script-like' en la naturaleza, pero jQuery selectors + real JavaScript/DOM es un salvavidas en las páginas más complicadas (o malformadas).

 2
Author: kkubasik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-12 18:27:48