我正在尝试编写一个解析器,它将HTML和转换/输出转换为Wiki语法(<b>
= '''
,<i>
= ''
等)。
到目前为止,BeautifulSoup似乎只能替换标记中的内容,因此<b>
变为<'''>
而不是'''
。我可以使用re.sub()来交换它们,但是由于BS将文档转换为“复杂的Python对象树”,我无法弄清楚如何交换这些标记并将它们重新插入整体文档。
有没有人有想法?
答案 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
以使用开始和结束字符串。