Массаж с BeautifulSoup или очистить с помощью Regex - PullRequest
5 голосов
/ 17 июня 2010

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

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Я подумал, что должен перефразировать мой ответ.

Встроенные массажи хороши для легких повреждений (лишние пробелы, закрывающие косые черты и т. Д.). Я, конечно, постараюсь сойти с рук, прежде чем заниматься чем-либо еще.

Вы можете передать свой собственный массаж , и я бы посоветовал вам расширить набор по умолчанию:

import copy, re

myMassage = [(re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1))]
myNewMassage = copy.copy(BeautifulSoup.MARKUP_MASSAGE)
myNewMassage.extend(myMassage)

BeautifulSoup(badString, markupMassage=myNewMassage)
# Foo<!--This comment is malformed.-->Bar<br />Baz

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

2 голосов
/ 17 июня 2010

Из документации , методы массажа - это просто пары (regular expression, replacement function), поэтому я не думаю, что это действительно случай использования массажа или регулярных выражений.

например, чтобы привести в порядок искаженные комментарии:

(re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1))

Если вы посмотрите на источник метода _feed в BeautifulSoup.py, вы увидите, что они просто запускаются последовательно с разметкой:

for fix, m in self.markupMassage:
  markup = fix.sub(m, markup)

Итакхотя вы можете выполнить некоторую собственную обработку регулярных выражений до того, как BeautifulSoup увидит разметку, вам, вероятно, лучше объединить любые необходимые дополнительные операции со встроенным встроенным MARKUP_MASSAGE, как показано в ответе Оли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...