使用BeautifulSoup按摩或使用正则表达式清洁

时间:2010-06-17 11:33:19

标签: python beautifulsoup

有人能告诉我什么是清理坏HTML的更好方法,所以BeautifulSoup可以处理它 - 如果使用BeautifulSoup的按摩方法或使用正则表达式清理它?

2 个答案:

答案 0 :(得分:3)

以为我应该改写我的答案。

内置按摩有利于轻微损伤(额外的空白,没有斜线等)。在进一步参与之前,我肯定会尝试躲开这些。

您可以pass in your own massages我建议您扩展默认设置:

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优化......虽然运行时性能可能非常相似。

答案 1 :(得分:2)

the documentation起,按摩方法只是(regular expression, replacement function)对,所以我认为这不是一个使用按摩或正则表达式的情况。

e.g。整理不正确的评论:

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

如果你看一下BeautifulSoup.py中_feed方法的来源,你会发现它们只是按照标记顺序运行:

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

因此,虽然你可以在BeautifulSoup看到标记之前对你自己进行一些正则表达式处理,但你可能更好地将所需的任何额外整理与默认内置MARKUP_MASSAGE结合起来,如Oli's回答所示。< / p>