BeautifulSoup replace_with用于非标准标签

时间:2016-03-02 21:46:36

标签: python html beautifulsoup

我正在尝试编写一个解析器,它将HTML和转换/输出转换为Wiki语法(<b> = '''<i> = ''等)。

到目前为止,BeautifulSoup似乎只能替换标记中的内容,因此<b>变为<'''>而不是'''。我可以使用re.sub()来交换它们,但是由于BS将文档转换为“复杂的Python对象树”,我无法弄清楚如何交换这些标记并将它们重新插入整体文档。

有没有人有想法?

2 个答案:

答案 0 :(得分:3)

我很确定已有工具可以帮助您,但如果您询问如何使用BeautifulSoup执行此操作,则可以使用replace_with(),但您需要保留元素的文本。天真而简单的例子:

from bs4 import BeautifulSoup

data = """
<div>
    <b>test1</b>
    <i>test2</i>
</div>
"""

soup = BeautifulSoup(data, "html.parser")

for b in soup.find_all("b"):
    b.replace_with("'''%s'''" % b.text)

for i in soup.find_all("i"):
    i.replace_with("''%s''" % i.text)

print(soup.prettify())

打印:

<div>
 '''test1'''
 ''test2''
</div>

答案 1 :(得分:-1)

还可以处理嵌套标签,例如"<div><b>bold with some <i>italics</i></b></div>"您必须多加小心。

当我需要做类似的事情时,我整理了以下实现:

from bs4 import BeautifulSoup

def wikify_tag(tag, replacement):
    tag.insert(0, replacement)
    tag.append(replacement)
    tag.unwrap()

data = """
<div>
    <b>test1</b>
    <i>test2</i>
    <b>bold with some <i>italics</i></b>
</div>
"""

soup = BeautifulSoup(data, "html.parser")

for b in soup.find_all("b"):
    wikify_tag(b, "'''")

for i in soup.find_all("i"):
    wikify_tag(i, "''")

print(soup)

打印(请注意.prettify()使它看起来更难看):

<div>
'''test1'''
''test2''
'''bold with some ''italics'''''
</div>

如果您还想用wiki模板替换标签,则可以扩展wikify_tag以使用开始和结束字符串。