Pregunta

estoy pensando en intentarlo Hermosa sopa, un paquete de Python para raspado de HTML.¿Hay otros paquetes de raspado de HTML que debería considerar?Python no es un requisito; de hecho, también estoy interesado en conocer otros lenguajes.

La historia hasta ahora:

¿Fue útil?

Solución

El equivalente del mundo Ruby a Beautiful Soup es el de Why_the_lucky_stiff albaricoque.

Otros consejos

En el mundo .NET, recomiendo HTML Agility Pack.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 XML bien formado, por lo que puede usar XPATH o simplemente iterar sobre nodos.

http://www.codeplex.com/htmlagilitypack

BeautifulSoup es una excelente manera de realizar el scraping de HTML.Mi trabajo anterior me obligaba a raspar mucho y desearía haber sabido sobre BeautifulSoup cuando comencé.Es como el DOM con opciones mucho más útiles y es mucho más pitónico.Si quieres probar Ruby, portaron BeautifulSoup llamándolo RubyfulSoup pero no se ha actualizado desde hace un tiempo.

Otras herramientas útiles son HTMLParser o sgmllib.SGMLParser, que forman parte de la biblioteca estándar de Python.Estos funcionan llamando a métodos cada vez que ingresa/sale de una etiqueta y encuentra 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 necesitas su poder, puedes utilizarlo allí.Yo digo que elija BeautifulSoup a menos que necesite velocidad y una menor huella de memoria.Si encuentra un analizador HTML mejor en Python, hágamelo saber.

encontré HTMLSQL ser una forma ridículamente sencilla de hacer screencrape.Se necesitan literalmente unos minutos para obtener resultados.

Las consultas son súper intuitivas, como:

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

Ahora existen otras alternativas que adoptan el mismo enfoque.

La pitón lxml La biblioteca actúa como un enlace Pythonic para las bibliotecas libxml2 y libxslt.Me gusta especialmente su compatibilidad con XPath y su bonita impresión de la estructura XML en memoria.También admite 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.

Para Perl, existe WWW::Mechanize.

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

  • mecanizar:similar a perla WWW:Mechanize.Le proporciona un objeto similar a un navegador para interaccionar con las páginas web.
  • lxml:Enlace de Python a libwww.Admite varias opciones para recorrer y seleccionar elementos (p. ej. XPath y selección de CSS)
  • marca de raspado:Biblioteca de alto nivel que utiliza plantillas para extraer información de HTML.
  • piquería:le permite realizar consultas similares a jQuery en documentos XML.
  • raspado:un marco de raspado y rastreo web de alto nivel.Puede usarse para escribir arañas, para minería de datos y para monitoreo y pruebas automatizadas.

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

Encuéntralo aquí

También hay una publicación de blog al respecto aquí.

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

El creador de plantillas utilidad de Adrian Holovaty (de Django fama) 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).

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

lo se y lo amo Raspador de pantalla.

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.

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

Scraping Stack Overflow es especialmente fácil con Zapatos y albaricoque.

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

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

Otra herramienta para .NET es MhtBuilder

También existe esta solución: netty HttpClient

Yo 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á prácticamente completo.Todo lo que viene antes de esto son las importaciones de bibliotecas y la configuración de mi proxy.

He usado mucho Beautiful Soup con Python.Es mucho mejor que la verificación de expresiones regulares, porque funciona como usar el DOMINGO, incluso si el HTML tiene un formato deficiente.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 cual es más útil para comprender el contenido del código que con las expresiones regulares.Desearía que Beautiful Soup existiera hace años, cuando tuve que raspar mucho la pantalla; me habría ahorrado mucho tiempo y dolores de cabeza ya que la estructura HTML era muy pobre antes de que la gente comenzara a validarla.

Aunque fue diseñado para .NETO pruebas web, he estado usando el WatiN marco para este fin.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 un MediosWiki Consulta del espacio de nombres de todas las páginas en una hoja de cálculo de Excel.La siguiente VB.NET El fragmento de código 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

Implementaciones de la Algoritmo de análisis HTML5: html5lib (Python, Rubí), Analizador HTML Validator.nu (Java, JavaScript;C++ en desarrollo), Alboroto (C), Twintsam (C#;próximo).

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

Ponte manos a la obra con los siguientes módulos y mejora cualquier problema.

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

He usado LWP y HTML::Constructor de árboles con Perl y los he encontrado muy útiles.

LWP (abreviatura de libwww-perl) le permite conectarse a sitios web y extraer el HTML, Puedes 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, es posible que todavía quede mucho trabajo pesado por hacer con un enfoque como este.no he mirado el Mecanizar módulo sugerido por otra respuesta, por lo que bien puedo hacerlo.

En Java, puedes usar EtiquetaSopa.

Bueno, si quieres hacerlo desde el lado del cliente usando sólo un navegador que tengas jcrawl.com.Después de haber diseñado tu 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 eliminación 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 el ultimas noticias de Yahoo tenis.

Probablemente ya tengas tanto, pero creo que esto es lo que estás intentando 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")

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

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

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

Puedes 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 realizar publicaciones, aceptar cookies y configurar el agente de usuario.

También tuve gran éxito al usar Jaxer + jQuery de Aptana para analizar páginas.No es tan rápido ni 'similar a un script' por naturaleza, pero los selectores jQuery + JavaScript/DOM real son un salvavidas en páginas más complicadas (o con formato incorrecto).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top