Vra

Ek dink om te probeer om Pragtige Sop, 'n Luislang pakket vir die HTML-skraap.Is daar enige ander HTML-skraap pakkette ek moet wees op soek na?Python is nie'n vereiste is nie, ek is eintlik geïnteresseerd in die verhoor oor ander tale as goed.

Die storie tot dusver:

Was dit nuttig?

Oplossing

Die Ruby wêreld se ekwivalent aan Beautiful Sop is why_the_lucky_stiff is Hpricot .

Ander wenke

In die NET wêreld, Ek beveel die HTML Agility Pack. Nie naastenby so eenvoudig soos 'n paar van die bogenoemde opsies (soos HTMLSQL), maar dit is baie buigsaam. Dit kan jy swak gevorm HTML maniuplate asof dit goed gevorm XML, sodat jy XPath kan gebruik of net itereate oor nodes.

http://www.codeplex.com/htmlagilitypack

BeautifulSoup is 'n goeie manier om te gaan vir HTML skraap. My vorige werk het my besig met 'n baie skraap en ek wens ek het geweet oor BeautifulSoup toe ek begin. Dit is soos die DOM met 'n baie meer nuttig opsies en is 'n baie meer pythonic. As jy wil om te probeer Ruby hulle oorgedra BeautifulSoup noem dit RubyfulSoup maar dit is nog nie opgedateer in 'n rukkie.

Ander nuttige gereedskap is HTMLParser of sgmllib.SGMLParser wat deel van die standaard Python biblioteek is. Hierdie werk deur te bel metodes elke keer as jy tik / uitgang 'n tag en ontmoeting html teks. Hulle is soos Expat as jy vertroud is met dit. Hierdie biblioteke is veral nuttig as jy gaan baie groot lêers te ontleed en die skep van 'n DOM boom sou lank en duur wees.

Gereelde uitdrukkings is nie baie nodig. BeautifulSoup hanteer gereelde uitdrukkings so as jy hulle mag nodig kan jy dit daar te benut. Ek sê gaan met BeautifulSoup tensy jy spoed en 'n kleiner geheue voetspoor nodig. As jy 'n beter HTML parser op Python vind, laat my weet.

Ek het gevind HTMLSQL om 'n belaglik eenvoudige manier om screenscrapen wees. Dit neem letterlik minute om resultate te kry met dit.

Die navrae is super-intuïtief - soos:

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

Daar is nou 'n paar ander alternatiewe wat dieselfde benadering te neem.

Die Python lxml biblioteek dien as 'n Pythonic bindend vir die libxml2 en libxslt biblioteke. Ek hou veral sy XPath ondersteuning en mooi-druk van die in-geheue XML struktuur. Dit ondersteun ook die ontleding van gebreekte HTML. En ek dink nie jy kan ander Python biblioteke / bindings wat XML vinniger as lxml ontleed vind.

Vir Perl, daar is WWW :: meganiseer.

Python het verskeie opsies vir HTML skraap bykomend tot Mooie Sop. Hier is 'n paar ander:

  • meganiseer : soortgelyk aan WWW:Mechanize perl. Gee jou 'n leser soos voorwerp te ineract met webblaaie
  • lxml : Python binding aan libwww. Ondersteun verskeie opsies om oor te steek en kies elemente (bv XPath en CSS seleksie)
  • scrapemark :. 'N hoë vlak biblioteek met behulp van templates om inligting uit HTML onttrek
  • pyquery :. Kan jy 'n jQuery maak soos navrae oor XML dokumente
  • scrapy : 'n hoë vlak skraap en web kruip raamwerk. Dit kan gebruik word om spinnekoppe te skryf, vir data-ontginning en vir die monitering en outomatiese toets

'Simple HTML DOM Parser' is 'n goeie opsie vir PHP, as u vertroud is met jQuery of JavaScript keurders dan sal jy jouself by die huis.

dit hier Soek

Daar is ook 'n blog post oor dit hier.

Hoekom het niemand genoem JSOUP nog vir Java? http://jsoup.org/

Die templatemaker nut van Adrian Holovaty (van Django faam) gebruik 'n baie interessante benadering: Jy voer dit variasies van dieselfde bladsy en dit" leer "waar die" gate "vir veranderlike data is. Dit is nie HTML spesifieke, so dit sal goed wees vir skraap enige ander plat inhoud sowel wees. Ek het dit ook gebruik vir PDFs en HTML omgeskakel word na skoonteks (met pdftotext en lynx, onderskeidelik).

Ek sou eerste uit te vind of die webwerf (s) in vraag te voorsien 'n API-bediener of RSS Feeds vir toegang die data wat jy nodig het.

Ek weet en is lief vir skerm-skraper .

skerm-skraper is 'n instrument vir die wen data van webtuistes. Skerm-skraper automatiseert:

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

Common gebruik:

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

Tegniese:

* 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

Drie uitgawes van die skerm-skraper:

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

Nog 'n opsie vir Perl sou Web :: skraper wat gebaseer is op Ruby se Scrapi . In 'n neutedop, met 'n mooi en bondige sintaksis, kan jy 'n robuuste skraper direk te kry in datastrukture.

Uitschrapen stapel Oorloop is veral maklik met Shoes en 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

Ek het 'n paar sukses met HtmlUnit , in Java gehad. Dit is 'n eenvoudige raamwerk vir die skryf van eenheid toetse op web UI, maar ewe nuttig vir HTML skraap.

Nog 'n instrument vir NET is MhtBuilder

Daar is hierdie oplossing te: netty HttpClient

Ek gebruik Hpricot op Ruby. As 'n voorbeeld is dit 'n brokkie kode wat ek gebruik om te alle boektitels van die ses bladsye van my HireThings rekening te herwin (as hulle lyk nie na 'n enkele bladsy te voorsien met hierdie inligting):

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 

Dit is pretty much klaar. Almal wat voor dit kom is biblioteek invoer en die instellings vir my volmag.

Ek het gebruik gemaak van die Pragtige Sop'n baie met Python.Dit is baie beter as die gewone uitdrukking nagaan, want dit werk soos met behulp van die DOM, selfs indien die HTML-is swak geformatteerde.Jy kan vinnig te vind HTML tags en teks met eenvoudiger sintaksis as gereelde uitdrukkings.Sodra jy vind'n element, jy kan itereer oor dit en sy kinders, wat is meer nuttig is vir die begrip van die inhoud in die kode as wat dit is met gereelde uitdrukkings.Ek wens Pragtige Sop bestaan het jare gelede, toe ek het'n baie te doen van screenscraping-dit sou gespaar het vir my'n baie tyd en hoofpyn sedert HTML-struktuur was so swak voordat mense begin validering van dit.

Hoewel dit ontwerp is vir NET web-toets, het ek met behulp van al die WatiN raamwerk vir hierdie doel. Want dit is DOM-gebaseerde, dit is redelik maklik om te HTML, teks, of beelde vas te vang. Recentely, gebruik ek dit om 'n lys van skakels van 'n MediaWiki Alle Bladsye naamruimte navraag in 'n stort Excel spreadsheet. Die volgende VB.NET kode fragement is redelik kru, maar dit werk.


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

implementering van die HTML5 ontleding van algoritme : html5lib (Python, Ruby), Validator.nu HTML Parser (Java, JavaScript, C ++ in ontwikkeling), herrie (C), Twintsam (C #, opkomende).

Jy sal 'n dwaas wees nie Perl gebruik .. Hier kom die vlamme ..

Bone up op die volgende modules en Ginsu enige skraap rond.

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

Ek gebruik LWP en HTML :: TreeBuilder met Perl en het bevind dat hulle baie nuttig.

LWP (kort vir libwww-perl) kan jy in verbinding bly om webwerwe en skraap die HTML, jy kan die module hier kry en die O'Reilly boek lyk hier aanlyn wees.

TreeBuilder kan jy 'n boom te bou van die HTML, en dokumentasie en bron is beskikbaar in HTML :: TreeBuilder -. Parser dat 'n HTML syntax boom bou

Daar kan te veel swaar-opheffing nog te doen het met iets soos hierdie benadering al wees. Ek het nie gekyk na die meganiseer module voorgestel deur 'n ander antwoord, sodat ek kan goed doen nie.

In Java, kan jy gebruik TagSoup .

Wel, as jy wil dit uit die kliënt se kant gedoen met behulp van slegs 'n leser wat jy het jcrawl.com . Na jou afskaffing diens nadat ontwerp van die web-program ( http://www.jcrawl.com/app.html ), hoef jy net die gegenereerde script te voeg tot 'n HTML bladsy om te begin met behulp van / aanbieding van jou data.

Al die sloop logika gebeur op die die leser via JavaScript. Ek hoop jy vind dit nuttig. Klik op hierdie skakel vir 'n lewendige voorbeeld dat die jongste nuus uit Yahoo tennis .

Jy het waarskynlik net soveel reeds, maar ek dink dit is wat jy probeer om te doen:

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

Ek het gemengde welslae in NET behulp SgmlReader wat oorspronklik begin deur Chris Lovett en blyk te gewees het bygewerk deur MindTouch .

Ek hou van ImportXML (URL, XPath) funksie Google Spreadsheets.

Dit sal herhaal selle in die kolom as jou XPath uitdrukking meer as een waarde terug.

Jy kan tot 50 importxml() funksies op 'n spreadsheet.

RapidMiner se Web Plugin is ook redelik maklik om te gebruik. Dit kan poste doen, aanvaar koekies, en kan stel die gebruiker-agent .

Ek het ook 'n groot sukses met behulp van Aptana se Jaxer + jQuery om bladsye te ontleed. Dit is nie so vinnig of 'script-agtige "in die natuur, maar jQuery keurders + real JavaScript / DOM is 'n lewensredder op meer ingewikkeld (of verkeerd) bladsye.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top