Установите lxml в качестве парсера BeautifulSoup по умолчанию
Я работаю над проектом по поиску в сети и столкнулся с проблемами со скоростью. Чтобы попытаться это исправить, я хочу использовать lxml вместо html.parser в качестве парсера BeautifulSoup. Я был в состоянии сделать это:
soup = bs4.BeautifulSoup(html, 'lxml')
но я не хочу многократно печатать 'lxml'
каждый раз, когда я звоню BeautifulSoup. Есть ли способ, которым я могу установить, какой парсер будет использоваться один раз в начале моей программы?
2 ответа
В соответствии со спецификацией парсера использовать страницу документации:
Первым аргументом конструктора BeautifulSoup является строка или открытый дескриптор файла - разметка, которую вы хотите проанализировать. Второй аргумент - как вы хотите, чтобы разметка была проанализирована.
Если вы ничего не укажете, вы получите лучший установленный HTML-парсер. Beautiful Soup оценивает синтаксический анализатор lxml как лучший, затем html5lib, а затем встроенный синтаксический анализатор Python.
Другими словами, просто установка lxml
в той же среде Python делает его парсером по умолчанию.
Обратите внимание, что явное указание парсера считается наилучшим подходом. Существуют различия между синтаксическими анализаторами, которые могут привести к незначительным ошибкам, которые трудно отладить, если вы позволите BeautifulSoup
выбрать лучший парсер сам по себе. Вы также должны помнить, что вам нужно иметь lxml
установлены. И, если бы вы не установили его, вы бы его даже не заметили - BeautifulSoup
просто получит следующий доступный парсер без каких-либо ошибок.
Если вы все еще не хотите явно указывать синтаксический анализатор, по крайней мере, запишите для себя или для других, кто будет использовать код, который вы написали в README/ документации проекта, и перечислите lxml
в требованиях вашего проекта наряду с beautifulsoup4
,
Кроме того: "Явное лучше, чем неявное".
Очевидно, сначала посмотрите на принятый ответ. Это довольно хорошо, а что касается этой техничности:
но я не хочу многократно вводить 'lxml' каждый раз, когда я вызываю BeautifulSoup. Есть ли способ, которым я могу установить, какой парсер будет использоваться один раз в начале моей программы?
Если я правильно понял ваш вопрос, я могу подумать о двух подходах, которые избавят вас от нескольких нажатий клавиш: - Определить функцию-обертку или - Создать частичную функцию.
# V1 - define a wrapper function - most straight-forward.
import bs4
def bs_parse(html):
return bs4.BeautifulSoup(html, 'lxml')
# ...
html = ...
bs_parse(html)
Или если вы хотите похвастаться...
import bs4
from functools import partial
bs_parse = partial(bs4.BeautifulSoup, features='lxml')
# ...
html = ...
bs_parse(html)