BeautifulSoup 4.0b разметкаМассаж - PullRequest
3 голосов
/ 24 декабря 2011

Вчера я установил BeautifulSoup 4.0b, и теперь я хочу добавить пару regex-replace, которая будет запускаться на этапе предварительного синтаксического анализа.В документации говорится, что я могу просто использовать параметр markupMassage для __init__, который присваивает MARKUP_MASSAGE, но кажется, что 4.0b больше не имеет этих атрибутов, несмотря на то, что я не упомянул его в README (разве я его пропустил?).

Итак, мой вопрос, есть ли способ получить такую ​​же функциональность от BeautifulSoup 4.0b

1 Ответ

3 голосов
/ 25 декабря 2011

README (в некотором роде) покрывает эту проблему, но ее следует вывести, прочитав между строк этого раздела:

= О Прекрасном Супе 4 =

Это почти полное переписывание, которое удаляет пользовательский Beautiful Soup HTML-парсер в пользу системы, которая позволяет вам написать немного клея код и подключите любой анализатор HTML или XML вы хотите.

Beautiful Soup 4.0 поставляется с кодом для четырех парсеров:

  • Стандартный HTMLParser Python
  • HTML и XML парсеры lxml
  • HTML-парсер html5lib

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

Старый пользовательский синтаксический анализатор был основан на SGMLParser из устаревшего модуля sgmllib (который был удален в Python 3), и функциональность markupMassage была в основном там, чтобы исправить неправильную разметку, которая SGMLParser не мог справиться. Поэтому, когда ушел старый нестандартный парсер, функциональность markupMassage пошла вместе с ним.

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

Итак, если установлена ​​lxml, вам нужно будет сделать что-то вроде этого:

from bs4.builder import LXMLTreeBuilder

class Builder(LXMLTreeBuilder):
    def __init__(self, *args, **kwargs):
        super(Builder, self).__init__(*args, **kwargs)

    def prepare_markup(self, *args, **kwargs):

        markup, user_enc, doc_enc = super(Builder, self).prepare_markup(*args, **kwargs)

        # do markup massaging ...

        return markup, user_enc, doc_enc

soup = BeautifulSoup(html, builder=Builder())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...