Подтвердить что ты не робот

BeautifulSoup и lxml.html - что выбрать?

Я работаю над проектом, который будет включать в себя анализ HTML.

После поиска, я нашел два возможных варианта: BeautifulSoup и lxml.html

Есть ли какая-то причина предпочесть друг другу? Я использовал lxml для XML некоторое время назад, и я чувствую, что буду с ним более комфортно, однако BeautifulSoup кажется очень распространенным.

Я знаю, что должен использовать тот, который работает для меня, но я искал личный опыт с обоими.

4b9b3361

Ответ 1

Простой ответ, imo, заключается в том, что если вы доверяете своему источнику быть хорошо сформированным, перейдите к решению lxml. В противном случае, BeautifulSoup полностью.

Edit:

Этот ответ уже три года; стоит упомянуть, как отмечает Джонатан Ванаско в комментариях, что BeautifulSoup4 теперь поддерживает lxml как внутренний синтаксический анализатор, поэтому вы можете использовать расширенные функции и интерфейс BeautifulSoup без большой производительности, если хотите (хотя Я все равно прячусь прямо за lxml - возможно, это просто сила привычки:)).

Ответ 2

Таким образом, lxml позиционируется как быстродействующий синтаксический анализатор html и xml производительности, который, кстати, также включает модуль soupparser, чтобы вернуться к функциональности BeautifulSoup. BeautifulSoup - это проект из одного человека, призванный сэкономить время, чтобы быстро извлечь данные из плохо сформированного html или xml.

документация lxml говорит, что оба парсера имеют преимущества и недостатки. По этой причине lxml предоставляет soupparser, поэтому вы можете переключаться туда и обратно. Цитирование,

BeautifulSoup использует другой подход синтаксического анализа. Это не настоящий HTML парсер, но использует регулярные выражения для погружения через суп-суп. это поэтому в некоторых случаях более прощаю и менее хорош в других. это не редкость, что lxml/libxml2 анализирует и исправляет сломанный HTML лучше, но BeautifulSoup имеет суперсовременную поддержку для обнаружения кодирования. Это очень сильно зависит от того, какой парсер работает лучше.

В конце они говорят:

Недостатком использования этого анализатора является то, что он намного медленнее, чем HTML-анализатор lxml. Поэтому, если производительность важна, вы можете захотеть рассмотреть возможность использования soupparser только в качестве резерва для определенных случаев.

Если я правильно их понимаю, это означает, что парсер супа более надежный - он может иметь дело с "супом" неправильных тегов с помощью регулярных выражений, тогда как lxml более прост и просто разбирает вещи и строит дерево, как и следовало ожидать. Я полагаю, что это относится также к BeautifulSoup, а не только к soupparser для lxml.

Они также показывают, как извлечь выгоду из обнаружения BeautifulSoup кодирования, но все еще быстро разбираются с 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))

(Тот же источник: http://lxml.de/elementsoup.html).

В словах создателя BeautifulSoup

Что это! Повеселись! Я написал Beautiful Soup, чтобы спасти всех. Как только вы привыкнете к этому, вы должны иметь возможность пресекать данные из плохо спроектированные веб-сайты всего за несколько минут. Пришлите мне письмо, если вы иметь какие-либо комментарии, сталкиваться с проблемами или хотеть, чтобы я знал о ваших проект, который использует Beautiful Soup.

 --Leonard

Цитата из Документация Beautiful Soup.

Надеюсь, теперь это ясно. Суп - это блестящий проект из одного человека, призванный сэкономить время для извлечения данных из плохо разработанных сайтов. Цель состоит в том, чтобы сэкономить ваше время прямо сейчас, чтобы выполнить эту работу, не обязательно, чтобы сэкономить ваше время в долгосрочной перспективе и, безусловно, не оптимизировать производительность вашего программного обеспечения.

Кроме того, из lxml,

lxml был загружен из индекса пакета Python более двух миллион раз и также доступен непосредственно во многих пакетах распределения, например. для Linux или MacOS-X.

И, из Почему lxml?,

Библиотеки C libxml2 и libxslt имеют огромные преимущества:... Стандартно-совместимый... Полнофункциональный... быстрый. быстро! БЫСТРО!... lxml это новая привязка Python для libxml2 и libxslt...

Ответ 3

Использовать оба? lxml для DOM-манипуляции, BeautifulSoup для разбора:

http://lxml.de/elementsoup.html

Ответ 4

lxml отлично. Но анализ вашего ввода как html полезен, только если структура dom действительно помогает вам найти то, что вы ищете.

Можете ли вы использовать обычные строковые функции или регулярные выражения? Для многих задач синтаксического анализа html обработка вашего ввода в виде строки, а не html-документа, является контринтуитивно простым способом.