Opcje skrobania HTML? [Zamknięte]

406

Zastanawiam się nad wypróbowaniem Beautiful Soup , pakietu Pythona do skrobania HTML. Czy są jeszcze jakieś pakiety do zgarniania HTML, na które powinienem spojrzeć? Python nie jest wymagany, tak naprawdę jestem zainteresowany słuchaniem także o innych językach.

Dotychczasowe dzieje:

carla
źródło
(powiązane) Najlepsze metody parsowania HTML
Gordon
Link Tag Soup jest martwy.
Tapper7,
HtmlUnit to kompletna implementacja przeglądarki Java, której nie można podzielić na części (nie można pobrać tylko strony HTML i zeskrobać jej, pobierze ona wszystkie odnośne pliki, uruchomi skrypty itp.). Jako taki nie sądzę, że należy tutaj.
Mark Jeronimus
Podstawowa Java może obsługiwać HTML z wyrażeniami XPath, choć nie bez problemów. Część analizatora składni (DocumentBuilder) dusi się przy nieprawidłowym HTML, a 100% poprawny HTML jest w rzeczywistości dość rzadki w sieci. Dlatego lubię zastąpić parser JTidy . Jeśli chodzi o XPath, XPathExpressionmożna użyć własnego języka Java (który istnieje od wersji Java 1.5)
Mark Jeronimus

Odpowiedzi:

64

Świat Ruby, odpowiadający Pięknej Zupie, to dlaczego Hpricot_lucky_stiffa .

Joey deVilla
źródło
12
W dzisiejszych czasach ludzie Ruby przeszli na Nokogiri w celu złomowania.
Mark Thomas
44

W świecie .NET polecam HTML Agility Pack. Nie jest tak prosty jak niektóre z powyższych opcji (jak HTMLSQL), ale jest bardzo elastyczny. Pozwala maniuplować źle sformatowany HTML, tak jakby był dobrze sformatowanym XML, dzięki czemu można używać XPATH lub po prostu itereować na węzłach.

http://www.codeplex.com/htmlagilitypack

Jon Galloway
źródło
2
połączmy z nim linq i wygląda to bardziej jak HTMLSQL, nie?
Pobłogosław Yahu
3
Połącz z nim SharpQuery, a stanie się to jak jQuery! code.google.com/p/sharp-query
mpen
1
Pakiet HTML Agility Pack nie konstruuje poprawnie DOM dla wielu dokumentów HTML, które próbowałem.
Ash Berlin-Taylor,
37

BeautifulSoup to świetny sposób na skrobanie HTML. Moja poprzednia praca wymagała ode mnie dużo skrobania i chciałbym wiedzieć o BeautifulSoup, kiedy zaczynałem. To jest jak DOM z dużo bardziej użytecznymi opcjami i jest o wiele bardziej pythoniczny. Jeśli chcesz wypróbować Ruby, przenieśli BeautifulSoup, nazywając ją RubyfulSoup, ale od jakiegoś czasu nie była aktualizowana.

Inne przydatne narzędzia to HTMLParser lub sgmllib.SGMLParser, które są częścią standardowej biblioteki Pythona. Działają one poprzez wywoływanie metod za każdym razem, gdy wprowadzasz / opuszczasz tag i napotykasz tekst HTML. Są jak Expat, jeśli znasz to. Te biblioteki są szczególnie przydatne, jeśli zamierzasz analizować bardzo duże pliki, a utworzenie drzewa DOM byłoby długie i kosztowne.

Wyrażenia regularne nie są zbyt potrzebne. BeautifulSoup obsługuje wyrażenia regularne, więc jeśli potrzebujesz ich mocy, możesz z niej skorzystać. Mówię, że idź z BeautifulSoup, chyba że potrzebujesz prędkości i mniejszej pojemności pamięci. Jeśli znajdziesz lepszy parser HTML w Pythonie, daj mi znać.

Cristian
źródło
21

Odkryłem, że HTMLSQL jest śmiesznie prostym sposobem na screencrape. Uzyskanie wyników zajmuje dosłownie kilka minut.

Zapytania są bardzo intuicyjne - jak:

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

Istnieją teraz inne alternatywy, które przyjmują to samo podejście.

Deadprogrammer
źródło
7
Do Twojej wiadomości, to biblioteka PHP
Tristan Havelick
19

Biblioteka lxml Pythona działa jak powiązanie Pythonic dla bibliotek libxml2 i libxslt. Szczególnie podoba mi się obsługa XPath i ładne drukowanie struktury XML w pamięci. Obsługuje także parsowanie uszkodzonego HTML. I nie sądzę, że można znaleźć inne biblioteki / wiązania Pythona, które analizują XML szybciej niż lxml.

akaihola
źródło
18

Dla Perla jest WWW :: Mechanize.

andrewrk
źródło
16

Python ma kilka opcji skrobania HTML oprócz Beatiful Soup. Oto kilka innych:

  • mechanize : podobny do perla WWW:Mechanize. Daje obiekt typu przeglądarka, który nie ma wpływu na strony internetowe
  • lxml : Powiązanie Pythona z libwww. Obsługuje różne opcje przechodzenia i wyboru elementów (np. Wybór XPath i CSS)
  • scrapemark : biblioteka wysokiego poziomu używająca szablonów do wydobywania informacji z HTML.
  • pyquery : pozwala tworzyć jQuery, takie jak zapytania do dokumentów XML.
  • złomowanie : platforma do scrapowania i indeksowania na wysokim poziomie. Można go używać do pisania pająków, eksploracji danych oraz monitorowania i automatycznych testów
filippo
źródło
1
Biblioteka standardowa Python ma wbudowany parser HTML ... dlaczego po prostu tego nie użyć? docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare
14

„Prosty parser DOM HTML” jest dobrą opcją dla PHP, jeśli znasz się na selektorach jQuery lub JavaScript, to znajdziesz się w domu.

Znajdź tutaj

Jest tu także post na blogu.

użytkownik67627
źródło
1
Popieram ten. Nie trzeba instalować żadnych mod_python itp. Na serwerze WWW, aby działało
Brock Woolf
11

Narzędzie do tworzenia szablonów autorstwa Adriana Holovaty (znanego z Django ) stosuje bardzo interesujące podejście: podajesz odmiany tej samej strony i „uczy się”, gdzie znajdują się „dziury” dla zmiennych danych. Nie jest on specyficzny dla HTML, więc dobrze byłoby też zeskrobać dowolną inną treść w postaci zwykłego tekstu. Użyłem go również do plików PDF i HTML przekonwertowanych na zwykły tekst (odpowiednio z pdftotext i lynx).

akaihola
źródło
jak udało Ci się uzyskać szablon do pracy dla dużych stron HTML? Znalazłem, że ulega awarii, gdy daję mu coś nietrywialnego.
hoju
Podejrzewam, że nie miałem dużych stron HTML. Wydaje się, że nie ma problemów ze zgłoszeniem tego problemu na code.google.com/p/templatemaker/issues/list, więc prawdopodobnie należy wysłać tam przypadek testowy. Nie wygląda jednak na to, że Adrian utrzymuje bibliotekę. Zastanawiam się, czego używa obecnie w EveryBlock, ponieważ na pewno dużo skrobią.
akaihola
10

Znam i kocham skrobaczkę do ekranu .

Screen-Scraper to narzędzie do wydobywania danych ze stron internetowych. Screen Scraper automatyzuje:

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

Typowe zastosowania:

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

Techniczny:

* 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

Trzy edycje skrobaczki do ekranu:

* 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
źródło
Niestety nawet wersja podstawowa nie jest FOSS. Wydaje się być darmowy jak w piwie.
Andreas Kuckartz
9

Najpierw dowiem się, czy dane witryny zawierają serwer API lub kanały RSS umożliwiające dostęp do potrzebnych danych.

GateKiller
źródło
8

Przepełnienie stosu zgarniającego jest szczególnie łatwe w przypadku Butów i 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
źródło
8

Inną opcją dla Perla byłby Web :: Scraper oparty na Ruby's Scrapi . W skrócie, dzięki ładnej i zwięzłej składni, możesz uzyskać solidny skrobak bezpośrednio do struktur danych.

Jeff Atwood
źródło
7

Odniosłem pewien sukces z HtmlUnit w Javie. Jest to prosta platforma do pisania testów jednostkowych w interfejsie sieciowym, ale równie przydatna do skrobania HTML.

Henz
źródło
możesz też użyć go do oceny wykonania javascript, jeśli kiedykolwiek zajdzie taka potrzeba :)
David
5

Używam Hpricot na Ruby. Jako przykład jest to fragment kodu, którego używam do pobierania wszystkich tytułów książek z sześciu stron mojego konta HireThings (ponieważ nie zawierają one ani jednej strony z tymi informacjami):

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 

Jest prawie kompletny. Wszystko, co następuje wcześniej, to import biblioteki i ustawienia mojego serwera proxy.

Wolfbyte
źródło
5

Często używałem Pięknej Zupy z Pythonem. Jest to znacznie lepsze niż sprawdzanie wyrażeń regularnych, ponieważ działa jak używanie DOM , nawet jeśli HTML jest źle sformatowany. Możesz szybko znaleźć tagi HTML i tekst z prostszą składnią niż wyrażenia regularne. Po znalezieniu elementu można iterować nad nim i jego elementami potomnymi, co jest bardziej przydatne do zrozumienia zawartości w kodzie niż w przypadku wyrażeń regularnych. Chciałbym, żeby Piękna Zupa istniała wiele lat temu, kiedy musiałem robić dużo screenscrapingu - zaoszczędziłoby mi to dużo czasu i bólu głowy, ponieważ struktura HTML była tak słaba, zanim ludzie zaczęli ją sprawdzać.

Peter Mortensen
źródło
5

Mimo że został zaprojektowany do testowania sieci .NET , do tego celu korzystam z frameworka WatiN . Ponieważ jest oparty na DOM, bardzo łatwo jest przechwytywać HTML, tekst lub obrazy. Ostatnio użyłem go do zrzucenia listy linków z zapytania o przestrzeń nazw MediaWiki Wszystkie strony do arkusza kalkulacyjnego Excel. Poniższy fragment kodu VB.NET jest dość prymitywny, ale działa.


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
źródło
3

Byłbyś głupcem, gdybyś nie używał Perla ... Nadchodzą płomienie ...

Postaw na następujące moduły i ginsu zeskrobuj.

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
crojac
źródło
3

Użyłem LWP i HTML :: TreeBuilder z Perlem i uważam je za bardzo przydatne.

LWP (skrót od libwww-perl) pozwala łączyć się ze stronami internetowymi i zdrapać HTML, możesz pobrać moduł tutaj, a książka O'Reilly wydaje się być tutaj online .

TreeBuilder pozwala zbudować drzewo z HTML, a dokumentacja i źródło są dostępne w HTML :: TreeBuilder - Parser, który buduje drzewo składniowe HTML .

Jednak może być jeszcze zbyt dużo ćwiczeń, aby zrobić coś takiego. Nie spojrzałem na moduł Mechanizacji sugerowany przez inną odpowiedź, więc mogę to zrobić.

kaybenleroll
źródło
3

Cóż, jeśli chcesz to zrobić po stronie klienta przy użyciu tylko przeglądarki, masz jcrawl.com . Po zaprojektowaniu usługi złomowania z aplikacji internetowej ( http://www.jcrawl.com/app.html ) wystarczy dodać wygenerowany skrypt do strony HTML, aby rozpocząć używanie / prezentowanie danych.

Cała logika złomowania odbywa się w przeglądarce za pomocą JavaScript. Mam nadzieję, że uznasz to za przydatne. Kliknij ten link, aby zobaczyć przykład na żywo, który wyciąga najnowsze wiadomości z tenisa Yahoo .

Peter Mortensen
źródło
2

Prawdopodobnie masz już tyle, ale myślę, że to właśnie próbujesz zrobić:

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")
Dotacja
źródło
2

Miałem mieszane wyniki w .NET przy użyciu SgmlReader, który został pierwotnie uruchomiony przez Chrisa Lovetta i wydaje się być zaktualizowany przez MindTouch .

Shawn Miller
źródło
2

Podoba mi się funkcja ImportXML (URL, XPath) w arkuszach kalkulacyjnych Google.

Powtórzy komórki w dół kolumny, jeśli wyrażenie XPath zwróci więcej niż jedną wartość.

W importxml()jednym arkuszu kalkulacyjnym możesz mieć do 50 funkcji.

Wtyczka internetowa RapidMiner jest również bardzo łatwa w użyciu. Może robić posty, akceptuje pliki cookie i może ustawić klienta użytkownika .

Neil McGuigan
źródło
2

Odniosłem również duży sukces, używając Jaxer + jQuery Aptany do parsowania stron. Z natury nie jest tak szybki ani podobny do skryptu, ale selektory jQuery + prawdziwy JavaScript / DOM to ratownik na bardziej skomplikowanych (lub zniekształconych) stronach.

kkubasik
źródło