Предупреждение парсера lxml / BeautifulSoup - PullRequest
0 голосов
/ 26 апреля 2018

Используя Python 3, я пытаюсь проанализировать ужасный HTML (который не находится под моим контролем), используя lxml с BeautifulSoup, как описано здесь: http://lxml.de/elementsoup.html

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

Ссылка выше говорит: "Все, что вам нужно сделать, это передать ее функции fromstring ():"

from lxml.html.soupparser import fromstring
root = fromstring(tag_soup)

Вот что я делаю:

URL = 'http://some-place-on-the-internet.com'
html_goo = requests.get(URL).text
root = fromstring(html_goo)

Это работает в том смысле, что после этого я могу нормально манипулировать HTML. Моя проблема в том, что каждый раз, когда я запускаю скрипт, я получаю это надоедливое предупреждение:

/usr/lib/python3/dist-packages/bs4/__init__.py:166: UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

To get rid of this warning, change this:

 BeautifulSoup([your markup])

to this:

 BeautifulSoup([your markup], "html.parser")

  markup_type=markup_type))

Моя проблема, возможно, очевидна: я сам не создаю экземпляр BeautifulSoup. Я попытался добавить предложенный параметр в функцию fromstring, но это просто дает мне ошибку: TypeError: 'str' object is not callable. Пока поиски в Интернете оказались бесплодными.

Я бы хотел избавиться от этого предупреждения. Помощь оценена, спасибо заранее.

Ответы [ 3 ]

0 голосов
/ 01 октября 2018

При использовании BeautifulSoup мы всегда делаем следующее:

[переменная] = BeautifulSoup ([содержимое, которое вы хотите проанализировать])

Вот проблема:

Если вы уже установили «lxml», BeautifulSoup автоматически заметит, что он использовал его в качестве прецедента. Это не ошибка, просто уведомление.

Так как это убрать?

Просто сделайте это, как показано ниже:

[переменная] = BeautifulSoup ([содержимое, которое вы хотите проанализировать) , features = "lxml" )

"На основе последней версии BeautifulSoup, 4.6.3"

Обратите внимание, что разные версии BeautifulSoup имеют разные способы или грамматику для добавления этого шаблона, просто внимательно посмотрите на сообщение с уведомлением.

Удачи!

0 голосов
/ 03 ноября 2018

Для других init вроде:

soup = BeautifulSoup(html_doc)

Использование

soup = BeautifulSoup(html_doc, 'html.parser')

вместо

0 голосов
/ 26 апреля 2018

Мне нужно было прочитать исходные коды lxml и BeautifulSoup, чтобы понять это.

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

Рассматриваемая функция fromstring определена так:

def fromstring(data, beautifulsoup=None, makeelement=None, **bsargs):

Аргументы **bsargs заканчиваются отправкой в ​​конструктор BeautifulSoup, который вызывается так (в другой функции, _parse):

tree = beautifulsoup(source, **bsargs)

Конструктор BeautifulSoup определен так:

def __init__(self, markup="", features=None, builder=None,
             parse_only=None, from_encoding=None, exclude_encodings=None,
             **kwargs):

Теперь вернемся к предупреждению в вопросе, в котором рекомендуется добавить аргумент "html.parser" в конструктор BeautifulSoup. Согласно этому, это будет аргумент с именем features.

Поскольку функция fromstring будет передавать именованные аргументы в конструктор BeautifulSoup, мы можем указать синтаксический анализатор, присваивая аргумент функции fromstring, например:

root = fromstring(clean, features='html.parser')

Пуф. Предупреждение исчезает.

...