Pergunta

Estou pensando em tentar Sopa Linda, um pacote Python para extração de HTML.Há algum outro pacote de raspagem de HTML que eu deveria examinar?Python não é um requisito. Na verdade, estou interessado em ouvir sobre outras linguagens também.

A história até agora:

Foi útil?

Solução

O equivalente do mundo Ruby para Beautiful Soup é Why_the_lucky_stiff's Hpricot.

Outras dicas

No mundo .NET, recomendo o HTML Agility Pack.Não é tão simples quanto algumas das opções acima (como HTMLSQL), mas é muito flexível.Ele permite manipular HTML mal formado como se fosse XML bem formado, para que você possa usar XPATH ou apenas iterar em nós.

http://www.codeplex.com/htmlagilitypack

BeautifulSoup é uma ótima maneira de fazer scraping de HTML.Meu trabalho anterior me fez trabalhar muito e gostaria de ter conhecido o BeautifulSoup quando comecei.É como o DOM, com muito mais opções úteis e muito mais pythônico.Se você quiser experimentar o Ruby, eles portaram o BeautifulSoup chamando-o de RubyfulSoup, mas ele não é atualizado há algum tempo.

Outras ferramentas úteis são HTMLParser ou sgmllib.SGMLParser que fazem parte da biblioteca padrão do Python.Eles funcionam chamando métodos toda vez que você entra/sai de uma tag e encontra texto HTML.Eles são como expatriados, se você estiver familiarizado com isso.Essas bibliotecas são especialmente úteis se você for analisar arquivos muito grandes e criar uma árvore DOM for demorado e caro.

Expressões regulares não são muito necessárias.BeautifulSoup lida com expressões regulares, então se você precisar do poder deles, você pode utilizá-lo lá.Eu digo: escolha o BeautifulSoup, a menos que você precise de velocidade e menos consumo de memória.Se você encontrar um analisador de HTML melhor em Python, me avise.

eu encontrei HTMLSQL ser uma maneira ridiculamente simples de fazer screenscrape.Leva literalmente alguns minutos para obter resultados.

As consultas são superintuitivas - como:

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

Existem agora algumas outras alternativas que seguem a mesma abordagem.

O Píton lxml biblioteca atua como uma ligação Pythonic para as bibliotecas libxml2 e libxslt.Gosto particularmente do suporte XPath e da impressão bonita da estrutura XML na memória.Ele também oferece suporte à análise de HTML quebrado.E não acho que você possa encontrar outras bibliotecas/ligações Python que analisem XML mais rápido que lxml.

Para Perl, existe WWW::Mechanize.

Python tem várias opções para raspagem de HTML além do Beatiful Soup.Aqui estão alguns outros:

  • mecanizar:semelhante ao perl WWW:Mechanize.Oferece um objeto semelhante a um navegador para interagir com páginas da web
  • lxml:Ligação Python a libwww.Suporta várias opções para percorrer e selecionar elementos (por exemplo, XPath e seleção de CSS)
  • marca de raspar:biblioteca de alto nível utilizando templates para extrair informações de HTML.
  • consulta:permite que você faça consultas semelhantes a jQuery em documentos XML.
  • áspero:uma estrutura de raspagem e rastreamento da web de alto nível.Pode ser usado para escrever spiders, para mineração de dados e para monitoramento e testes automatizados

'Simple HTML DOM Parser' é uma boa opção para PHP, se você estiver familiarizado com os seletores jQuery ou JavaScript, você se sentirá em casa.

Encontre aqui

Há também uma postagem no blog sobre isso aqui.

Por que ninguém mencionou JSOUP ainda para Java? http://jsoup.org/

O criador de modelos utilitário de Adrian Holovaty (de Django fama) usa uma abordagem muito interessante:Você alimenta variações da mesma página e ele "aprende" onde estão os "buracos" para dados variáveis.Não é específico do HTML, então também seria bom para copiar qualquer outro conteúdo de texto simples.Usei-o também para PDFs e HTML convertidos em texto simples (com pdftotext e lynx, respectivamente).

Gostaria primeiro de descobrir se o(s) site(s) em questão fornecem um servidor API ou feeds RSS para acessar os dados necessários.

eu sei e amo Raspador de tela.

Screen-Scraper é uma ferramenta para extrair dados de sites.O raspador de tela automatiza:

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

Usos comuns:

* 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

Três edições do raspador de tela:

* 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.

Outra opção para Perl seria Web:: Raspador que é baseado no Ruby Scrapi.Resumindo, com uma sintaxe agradável e concisa, você pode obter um raspador robusto diretamente nas estruturas de dados.

Raspar Stack Overflow é especialmente fácil com Sapato e 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

Eu tive algum sucesso com Unidade HTML, em Java.É uma estrutura simples para escrever testes unitários em UIs da web, mas igualmente útil para raspagem de HTML.

Outra ferramenta para .NET é Construtor Mht

Também existe esta solução: netty HttpClient

Eu uso Hpricot em Ruby.Por exemplo, este é um trecho de código que uso para recuperar todos os títulos de livros das seis páginas da minha conta HireThings (já que eles não parecem fornecer uma única página com essas informações):

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á praticamente completo.Tudo o que vem antes disso são as importações da biblioteca e as configurações do meu proxy.

Usei muito o Beautiful Soup com Python.É muito melhor que a verificação de expressões regulares, porque funciona como usar o DOM, mesmo que o HTML esteja mal formatado.Você pode encontrar rapidamente tags HTML e texto com sintaxe mais simples do que expressões regulares.Depois de encontrar um elemento, você pode iterar sobre ele e seus filhos, o que é mais útil para entender o conteúdo do código do que com expressões regulares.Eu gostaria que o Beautiful Soup existisse anos atrás, quando eu tive que fazer muitas capturas de tela - isso teria me poupado muito tempo e dor de cabeça, já que a estrutura do HTML era muito pobre antes das pessoas começarem a validá-la.

Embora tenha sido projetado para .LÍQUIDO testes na web, tenho usado o WatiN quadro para esse fim.Por ser baseado em DOM, é muito fácil capturar HTML, texto ou imagens.Recentemente, usei-o para despejar uma lista de links de um MediaWiki Consulta de namespace de todas as páginas em uma planilha do Excel.A seguir VB.NET o fragmento de código é bastante rudimentar, mas 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

Implementações do Algoritmo de análise HTML5: html5lib (Python, Rubi), Analisador de HTML Validator.nu (Java, JavaScript;C++ em desenvolvimento), burburinho (C), Twintsam (C#;por vir).

Você seria um tolo se não usasse Perl.Aí vêm as chamas..

Aperte os seguintes módulos e ginsu qualquer arranhão.

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

Eu tenho usado LWP e HTML::TreeBuilder com Perl e os achei muito úteis.

LWP (abreviação de libwww-perl) permite conectar-se a sites e copiar o HTML, você pode obter o módulo aqui e o livro de O'Reilly parece estar online aqui.

TreeBuilder permite construir uma árvore a partir do HTML e documentação e fonte estão disponíveis em HTML::TreeBuilder - Analisador que constrói uma árvore de sintaxe HTML.

No entanto, pode haver muito trabalho pesado a fazer com algo como essa abordagem.Eu não olhei para o Módulo mecanizar sugerido por outra resposta, então posso muito bem fazer isso.

Em Java, você pode usar TagSopa.

Bem, se você quiser fazer isso do lado do cliente usando apenas um navegador, você tem jcrawl.com.Depois de projetar seu serviço de desmantelamento a partir do aplicativo web (http://www.jcrawl.com/app.html), você só precisa adicionar o script gerado a uma página HTML para começar a usar/apresentar seus dados.

Toda a lógica de desmantelamento acontece no navegador via JavaScript.Espero que você ache útil.Clique neste link para obter um exemplo ao vivo que extrai o últimas notícias do Yahoo tênis.

Você provavelmente já tem o mesmo, mas acho que é isso que você está tentando fazer:

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")

Tive resultados mistos em .NET usando SgmlReader, que foi originalmente iniciado por Chris Lovett e parece ter sido atualizado por MindTouch.

Gosto da função ImportXML(URL, XPath) do Google Spreadsheets.

Ele repetirá as células na coluna se sua expressão XPath retornar mais de um valor.

Você pode ter até 50 importxml() funções em uma planilha.

O Web Plugin do RapidMiner também é muito fácil de usar.Ele pode fazer postagens, aceitar cookies e definir o agente de usuário.

Também tive grande sucesso usando Jaxer + jQuery do Aptana para analisar páginas.Não é tão rápido ou 'semelhante a um script' por natureza, mas seletores jQuery + JavaScript/DOM real são um salva-vidas em páginas mais complicadas (ou malformadas).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top