去除不必要的内层标签

2 投票
6 回答
1846 浏览
提问于 2025-04-16 14:39

我们正在通过一些外部转换工具把DOCX文件转换成HTML格式。

生成的HTML中关于表格的部分大概是这样的:

<td><div><span><b>Patienten</b></span></div></td>

在这个表格的单元格(TD)里面,<div><span>标签完全是多余的。

我们希望得到的结果是:

<td><b>Patienten</b></td>

有没有什么办法可以用BeautifulSoup合理地去掉这些多余的标签呢?

6 个回答

0

你可以像这样重新排列解析树:

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup("<td><div><span><b>Patienten</b></span></div></td>")
td = soup.td
b = soup.td.div.span.b
td.insert(0,b)
td.div.extract()
print soup
1

我们的方法是使用lxml来确定每个元素的父元素和子元素。如果父元素和子元素之间没有文本内容的差异,我们就会遵循一套规则,保留某些子元素,同时丢掉父元素。然后,我们会强制使用合适的块级元素。在你的例子中,b是span、div和td的子元素,我们知道td标签是相关的结构元素,所以我们会把其他的去掉。同样,这需要测试每个嵌套元素的文本内容。

1

好吧,<div><span> 标签是有结构意义的,不能简单地认为它们是“多余的”。

你的问题看起来很像编译器中的抽象语法树(AST)优化。你可以尝试定义一些规则,创建一个 SoupOptimizer,让它处理一棵树(你的文档),然后生成一个优化后的输出树。规则可以是:

  • 如果 span 标签没有属性,就可以简化为内容:span(content) -> content
  • 如果 div 标签没有属性,也可以简化为内容:div(content) -> content

需要注意的是,XML方言的树转换可以通过XSLT来完成。不过,准备好在理解之前脑袋要转个圈哦!

撰写回答