Установите lxml в качестве парсера BeautifulSoup по умолчанию

Я работаю над проектом веб-скрепок и столкнулся с проблемами со скоростью. Чтобы исправить это, я хочу использовать lxml вместо html.parser как парсер BeautifulSoup. Я смог сделать это:

soup = bs4.BeautifulSoup(html, 'lxml')

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

Ответы

Ответ 1

В соответствии с Задание страницы анализатора:

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

Если вы ничего не укажете, вы получите лучший парсер HTML, который установлен. Beautiful Soup оценивает lxmls parser как лучший, затем html5libs, затем встроенный парсер Pythons.

Другими словами, просто установка lxml в ту же среду python делает его парсером по умолчанию.

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

Если вы все еще не хотите явно указывать синтаксический анализатор, по крайней мере, сделайте заметку для будущего самостоятельно или других пользователей, которые будут использовать код, который вы написали в проекте README/documentation, и список lxml в вашем проекте требований наряду с beautifulsoup4.

Кроме того: Явный лучше, чем неявный.

Ответ 2

Впервые рассмотрим принятый ответ. Это довольно хорошо, и что касается этой техничности:

но я не хочу, чтобы каждый раз набирать '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)