BeautifulSoup i lxml.html - co wybrać? [duplikat]

to pytanie ma już odpowiedzi tutaj : parsowanie HTML w Pythonie-lxml czy BeautifulSoup? Który z nich jest lepszy do jakich celów? (7 odpowiedzi) Zamknięty 7 lat temu .

Pracuję nad projektem, który będzie obejmował parsowanie HTML.

Po przeszukaniu, znalazłem dwie prawdopodobne opcje: BeautifulSoup i lxml.html

Czy Jest jakiś powód, by preferować jedno nad drugim? Używałem lxml do XML jakiś czas temu i czuję, że będzie mi z nim wygodniej, jednak BeautifulSoup wydaje się być bardzo powszechne.

I know I should use the one to mi pasuje, ale szukałem osobistych doświadczeń z obydwoma.

Author: user225312, 2011-02-11

4 answers

Prosta odpowiedź, imo, jest taka, że jeśli ufasz, że twoje źródło jest dobrze uformowane, Wybierz rozwiązanie lxml. / Align = "left"/

Edit:

Ta odpowiedź ma już trzy lata; warto zauważyć, jak Jonathan Vanasco robi w komentarzach, że BeautifulSoup4 teraz obsługuje używanie lxml jako wewnętrznego parsera, więc możesz korzystać z zaawansowanych funkcji i interfejsu BeautifulSoup bez większości hitów wydajności, jeśli chcesz (chociaż wciąż sięgam prosto po lxml siebie - może to tylko siła przyzwyczajenia :)).

 41
Author: simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-23 05:28:05

Podsumowując, {[2] } jest umieszczony jako błyskawiczny parser html i xml jakości produkcji, który, nawiasem mówiąc, zawiera również moduł soupparser, aby wrócić do funkcjonalności BeautifulSoup. BeautifulSoup to jednoosobowy projekt, zaprojektowany, aby zaoszczędzić czas na szybkie wyodrębnianie danych ze słabo uformowanego html lub xml.

Dokumentacja Lxml mówi, że oba parsery mają zalety i wady. Z tego powodu, lxml zapewnia soupparser, dzięki czemu można przełączać się tam iz powrotem. Cytowanie,

BeautifulSoup używa innego podejścia do parsowania. To nie jest prawdziwy HTML parser ale używa wyrażeń regularnych do przeszukiwania tagów. On dlatego w niektórych przypadkach bardziej wyrozumiały, a w innych mniej dobry. On często zdarza się, że lxml / libxml2 lepiej parsuje i naprawia zepsuty HTML, ale BeautifulSoup ma superiour wsparcie dla wykrywania kodowania. It bardzo wiele zależy od wejścia, który parser działa lepiej.

W końcu są mówiąc:

Minusem korzystania z tego parsera jest to, że jest on znacznie wolniejszy niż parser HTML lxml. więc jeśli wydajność ma znaczenie, możesz chcieć aby rozważyć użycie soupparser tylko jako alternatywy dla niektórych przypadków.

Jeśli dobrze je Rozumiem, oznacza to, że parser zupy jest bardziej wytrzymały - - - może poradzić sobie z "zupą" zniekształconych tagów za pomocą wyrażeń regularnych - - - podczas gdy lxml jest prostszy i po prostu parsuje rzeczy i buduje drzewo, jak można się spodziewać. Zakładam, że dotyczy to również samego BeautifulSoup, a nie tylko soupparser dla lxml.

Pokazują również, jak korzystać z detekcji kodowania BeautifulSoup, podczas szybkiego parsowania za pomocą lxml:

>>> from BeautifulSoup import UnicodeDammit

>>> def decode_html(html_string):
...     converted = UnicodeDammit(html_string, isHTML=True)
...     if not converted.unicode:
...         raise UnicodeDecodeError(
...             "Failed to detect encoding, tried [%s]",
...             ', '.join(converted.triedEncodings))
...     # print converted.originalEncoding
...     return converted.unicode

>>> root = lxml.html.fromstring(decode_html(tag_soup))

(to samo źródło: http://lxml.de/elementsoup.html).

Słowami Twórcy BeautifulSoup,

To jest to! Baw się dobrze! Napisałem piękną zupę, żeby oszczędzić wszystkim czasu. Kiedy się do tego przyzwyczaisz, powinieneś być w stanie wrangle dane z źle zaprojektowane strony internetowe w kilka minut. Wyślij mi e-mail, jeśli masz jakieś uwagi, napotkasz problemy lub chcesz, żebym wiedział o Twoim projekt, który wykorzystuje piękną zupę.

 --Leonard

Cytat z pięknej dokumentacji zupy.

Mam nadzieję, że to jest teraz jasne. The soup to genialny jednoosobowy projekt zaprojektowany, aby zaoszczędzić czas na wydobywanie danych ze źle zaprojektowanych stron internetowych. Celem jest oszczędność czasu w tej chwili, aby wykonać zadanie, a nie koniecznie, aby zaoszczędzić czas w dłuższej perspektywie, a na pewno nie w celu optymalizacji wydajności oprogramowania.

Również ze strony lxml ,

Lxml został pobrany z indeksu pakietów Pythona więcej niż dwa milion razy i jest również dostępny bezpośrednio w wielu pakietach dystrybucje, np. dla Linuksa lub MacOS-X.

A od dlaczego lxml?,

Biblioteki C libxml2 i libxslt mają ogromne korzyści:... Zgodny ze standardami... W pełni funkcjonalny... szybko. szybko! Szybko! ... lxml jest nowym Bindowaniem Pythona dla libxml2 i libxslt...

 19
Author: Sergey Orshanskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-23 18:16:58

Używać obu? lxml do manipulacji DOM, BeautifulSoup do parsowania:

Http://lxml.de/elementsoup.html

 2
Author: ymv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 07:35:44

Lxml jest świetny. Ale parsowanie danych wejściowych jako html jest przydatne tylko wtedy, gdy Struktura dom rzeczywiście pomaga znaleźć to, czego szukasz.

Czy Można używać zwykłych funkcji łańcuchowych lub wyrażeń regularnych? W przypadku wielu zadań przetwarzania html, traktowanie danych wejściowych jako ciąg znaków, a nie dokumentu html jest, wbrew intuicji, o wiele łatwiejsze.

 0
Author: dfichter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-11 11:30:47