去除不必要的内层标签
我们正在通过一些外部转换工具把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来完成。不过,准备好在理解之前脑袋要转个圈哦!