2008-11-13 6 views
23

W .Net znalazłem tę wspaniałą bibliotekę, HtmlAgilityPack, która pozwala łatwo analizować nieuporządkowany HTML przy użyciu XPath. Używałem tego przez kilka lat w moich witrynach .Net, ale musiałem zadowolić się bardziej bolesnymi bibliotekami dla moich Python, Ruby i innych projektów. Czy ktoś jest świadomy podobnych bibliotek dla innych języków?Parsowanie HTML za pomocą XPath

Odpowiedz

6

W Pythonie ElementTidy analizuje tag zupę i tworzy drzewo element, który pozwala na tworzenie kwerend przy użyciu XPath:

>>> from elementtidy.TidyHTMLTreeBuilder import TidyHTMLTreeBuilder as TB 
>>> tb = TB() 
>>> tb.feed("<p>Hello world") 
>>> e= tb.close() 
>>> e.find(".//{http://www.w3.org/1999/xhtml}p") 
<Element {http://www.w3.org/1999/xhtml}p at 264eb8> 
+1

Możesz rozważyć użycie lxml dla Pythona teraz –

+8

** Niebezpieczeństwo!** Zamiast tego użyj parsera BeautifulSoup dla lxml, ponieważ elementtidy spowoduje dławienie przestrzeni nazw, które nie są zadeklarowane. Nauczyłem się na własnej skórze! –

5

BeautifulSoup to dobra biblioteka Pythona do radzenia sobie z niechlujnym HTML w czysty sposób.

+13

BeautifulSoup nie używa XPath :) – dzen

3

Wygląda na to, że pytanie może być precyzyjniej określone jako "Jak przekonwertować HTML na XML, aby można było wyrazić wyrażenia XPath przeciwko niemu".

Oto dwa dobre narzędzia:

  1. TagSoup, program open source, jest Java i SAX - narzędzie oparte, opracowany przez John Cowan. Jest to parser zgodny z SAX napisany w Javie, który zamiast parsować dobrze uformowany lub poprawny XML, analizuje kod HTML, tak jak jest on w stanie dzikim: słaby, nieprzyjemny i brutalny, choć często daleki od krótkiego. TagSoup jest przeznaczony dla osób, które muszą przetwarzać te rzeczy, wykorzystując pewne elementy racjonalnego projektu aplikacji. Zapewniając interfejs SAX, umożliwia stosowanie standardowych narzędzi XML nawet w przypadku najgorszego kodu HTML. TagSoup zawiera również procesor wiersza poleceń, który odczytuje pliki HTML i może generować czysty HTML lub dobrze sformułowany XML, który jest zbliżony do XHTML.
    Taggle to komercyjny port Tag Tag w C++.

  2. SgmlReader to narzędzie opracowane przez firmę Microsoft w wersji Chris Lovett.
    SgmlReader to API XmlReader nad dowolnym dokumentem SGML (w tym wbudowaną obsługę HTML). Dostarczone jest również narzędzie wiersza poleceń, które wyprowadza dobrze uformowany wynik XML.
    Pobierz plik zip tym samodzielny plik wykonywalny i pełnym kodem źródłowym: SgmlReader.zip

1

wyjątkowym osiągnięciem jest the pure XSLT 2.0 Parser of HTML napisany przez David Carlisle.

Przeczytanie jej kodu byłoby świetnym ćwiczeniem dla każdego z nas.

Z opisu:

"d: htmlparse (ciąg)
  d: htmlparse (ciąg, nazw, HTML-mode)

    Jedna postać argument jest równoważna)
    d: htmlparse (string 'http://ww.w3.org/1999/xhtml', prawda()))

    Analizuje łańcuch jako HTML i/lub XML przy użyciu wbudowane pewne heurystyki tO)
    Sterowanie domniemane otwieranie i zamykanie elementów.

    To nie ma pełnej wiedzy o HTML DTD ale ma pełną listę
    pustych elementów i pełną listę definicji podmiotu.Obiekty HTML i
    odniesienia dziesiętne i heksadecymalne są akceptowane. Uwaga Znaczniki html
    są rozpoznawane, nawet jeśli html-mode = false().

nazwy     elementu są małe litery (jeśli HTML tryb jest prawdą()) i umieszcza się w
    nazw określonych parametrem namespace (który może być „” do oznaczania
    nie-nazw chyba że wejściowego explict deklaracji przestrzeni nazw, w
    takim przypadku będą one honorowane.

    nazwy atrybutów są małe litery, jeśli html-mode = true()
"

Przeczytaj bardziej szczegółowy opis here.

Mam nadzieję, że to pomogło.

Pozdrowienia,

Dimitre Novatchev.

2

Dla Ruby, bardzo polecam Hpricot, że Jb Evain wskazał. Jeśli szukasz szybszego konkurenta opartego na libxml, Nokogiri (patrz http://tenderlovemaking.com/2008/10/30/nokogiri-is-released/) również jest całkiem niezły (obsługuje zarówno wyszukiwania XPath, jak i CSS, takie jak Hpricot, ale jest szybszy). Jest podstawowy wiki i trochę benchmarks.

+1

Bardzo polecam [Nokogiri] (http: // Nokogiri. org) w tych dniach. To wszystko, czym był Hpricot i nie tylko. –

1

Istnieje darmowa implementacja języka C dla biblioteki XML o nazwie libxml2, która ma kilka bitów API dla XPath, z których korzystałem z wielkim sukcesem, które można określić HTML jako ładowany dokument. To działało dla mnie w przypadku mniej niż doskonałych dokumentów HTML.

W większości przypadków XPath jest najbardziej przydatny, gdy przychodzący kod HTML jest poprawnie zakodowany i można go odczytać "jak dokument XML". Możesz rozważyć użycie specjalnego narzędzia do czyszczenia dokumentów HTML. Oto jeden przykład: http://tidy.sourceforge.net/

Jeśli chodzi o narzędzia XPath, najprawdopodobniej okaże się, że większość implementacji opiera się na wcześniej istniejących bibliotekach C lub C++, takich jak libxml2.

41

Dziwię się, że nie jest to pojedyncza wzmianka lxml. Jest niesamowicie szybki i działa w każdym środowisku, które pozwala na biblioteki CPython.

Oto, w jaki sposób you can parse HTML via XPATH using lxml.

>>> from lxml import etree 
>>> doc = '<foo><bar></bar></foo>' 
>>> tree = etree.HTML(doc) 

>>> r = tree.xpath('/foo/bar') 
>>> len(r) 
1 
>>> r[0].tag 
'bar' 

>>> r = tree.xpath('bar') 
>>> r[0].tag 
'bar' 
+1

Cholera, to stare pytanie: -/ –

+8

Nie oznacza, że ​​możesz na nie odpowiedzieć. Najlepiej, gdyby najlepsza odpowiedź pojawiła się nawet po bardzo długim czasie. Nawiasem mówiąc, twoja odpowiedź analizuje tylko XML, a nie HTML. Powinieneś dołączyć instancję 'HTMLParser'. – phihag

+1

phihag: Naprawiono. Teraz działa również z HTML, o ile dokument zawiera tekst, który chcemy przeanalizować. –

5

Najbardziej stabilne wyniki, jakie dotychczas stosowałem, przy korzystaniu z parsera lxml.html. Musisz zainstalować python-lxml i python-BeautifulSoup, można wykonać następujące czynności: