Który parser HTML jest najlepszy? [Zamknięte]

194

Koduję wiele parserów. Do tej pory korzystałem z bezgłowej przeglądarki HtmlUnit do analizowania i automatyzacji przeglądarki.

Teraz chcę oddzielić oba zadania.

Ponieważ 80% mojej pracy polega na analizie, chcę użyć lekkiego parsera HTML, ponieważ najpierw zajmuje dużo czasu w HtmlUnit, aby załadować stronę, następnie pobrać źródło, a następnie parsować.

Chcę wiedzieć, który parser HTML jest najlepszy. Analizator składni byłby lepszy, gdyby był zbliżony do analizatora składni HtmlUnit.


EDYTOWAĆ:

Co najlepsze, chcę przynajmniej następujące funkcje:

  1. Prędkość
  2. Łatwo zlokalizuj dowolny element HTML za pomocą jego „id”, „name” lub „tag type”.

Byłoby dla mnie ok, jeśli nie wyczyści brudnego kodu HTML. Nie muszę czyścić żadnego źródła HTML. Potrzebuję tylko najprostszego sposobu na poruszanie się po elementach HTML i zbieranie z nich danych.

Yatendra Goel
źródło
2
Co masz na myśli mówiąc „najlepszy”? Masz na myśli szybkość, łatwość przejścia od bieżącego wdrożenia, zgodność ze standardami W3C, coś innego, o czym nie myślałem? Twoje pytanie oznacza szybkość, ale także czas przejścia do rozwoju. Pewne wyjaśnienia mogą pomóc innym w poleceniu dobrych parserów, które lepiej pasują do twoich potrzeb.
aperkins
2
Twoje stwierdzenie „Koduję wiele parserów” wydaje się nie zgadzać z pytaniem. Czy masz na myśli „muszę często używać parserów HTML?”
puste
11
Myślę, że to pytanie jest na tyle szczegółowe, że można je wyłączyć z „mało konstruktywnego” bliskiego powodu.
Bill the Lizard
9
Głosuj, aby ponownie go otworzyć. Jest to wystarczająco szczegółowe i nie powinno być zamykane.
AZ_
3
Tak, niektórzy ludzie na SO toczą świętą wojnę przeciwko świętym wojnom z „najlepszymi” pytaniami. Tak denerwujące. Głosowanie w odpowiedzi wyraźnie wskazuje na przydatność tego pytania.
user1050755

Odpowiedzi:

396

Własna wtyczka: Właśnie wydałem nowy parser Java HTML: jsoup . Wspominam o tym tutaj, ponieważ myślę, że zrobi to, o co ci chodzi.

Jego sztuczką drużynową jest składnia selektora CSS do znajdowania elementów, np .:

String html = "<html><head><title>First parse</title></head>"
  + "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
Elements links = doc.select("a");
Element head = doc.select("head").first();

Zobacz Selektor uzyskać więcej informacji, javadoc .

To nowy projekt, więc wszelkie pomysły na ulepszenia są bardzo mile widziane!

Jonathan Hedley
źródło
15
To jest fantastyczne i uwielbiam obsługę selektora CSS. Ledwo wiem, że używam biblioteki Java. :-)
William Pietri
17
Nie przestawaj tego wspierać. Właśnie tego potrzebowaliśmy do parsowania HTML przy użyciu Java po stronie serwera! To jest niesamowite! W kilka godzin zbudowałem serwer proxy, który modyfikuje wszystkie łącza src i href, aby były pełne ścieżki do serwera źródłowego.
jmort253
7
Właśnie rzuciłem na to okiem. Podoba mi się jego interfejs i dokumentacja. Łatwo to zrozumieć. :)
emeraldhieu
5
Dobra robota! Uruchomienie jsoup w mniej niż 10 minut.
Indrek Kõue,
10
Niewiarygodne, to jest takie chore. Byłem w stanie przetworzyć stronę HTML w ciągu kilku minut. DZIĘKUJEMY ZA TAK WIELKĄ PRACĘ.
Michael-O,
32

Najlepsze, jakie do tej pory widziałem, to HtmlCleaner :

HtmlCleaner to parser HTML typu open source napisany w Javie. HTML znaleziony w sieci jest zazwyczaj brudny, źle sformułowany i nie nadaje się do dalszego przetwarzania. W przypadku poważnego zużycia takich dokumentów konieczne jest najpierw posprzątać bałagan i uporządkować tagi, atrybuty i zwykły tekst. Dla podanego dokumentu HTML HtmlCleaner zmienia kolejność poszczególnych elementów i tworzy dobrze sformatowany XML. Domyślnie przestrzega podobnych zasad, z których korzysta większość przeglądarek internetowych w celu utworzenia modelu obiektowego dokumentu. Użytkownik może jednak podać niestandardowy zestaw tagów i zestaw reguł do filtrowania i równoważenia tagów.

Dzięki HtmlCleaner możesz zlokalizować dowolny element za pomocą XPath.

W przypadku innych parserów HTML zobacz to SO pytanie .

tangens
źródło
1
Musisz samodzielnie obsłużyć serwer proxy, a następnie użyć HtmlCleaner do przetworzenia strumienia. => To nie jest wygodne. T__T
kidnan1991
Czy HTMLTidy nie byłoby lepszą opcją? html-tidy.org
Troy
1
Similar rules that the most of web browsers use- To nie jest zbyt przekonujące
pguardiario