我们正在通过一些外部转换器工具将DOCX转换为HTML。 生成的表格HTML包含如下内容:
<td><div><span><b>Patienten</b></span></div></td>
TD内的<div>
和<span>
标签在这里完全是多余的。
预期结果是
<td><b>Patienten</b></td>
有没有机会使用BeautifulSoup以理智的方式删除它们?
答案 0 :(得分:1)
好吧,<div>
和<span>
标签具有结构意义,不能自动猜到“多余”。
您的问题看起来与编译器中完成的AST(抽象语法树)优化非常相似。您可以尝试定义一些规则并构建SoupOptimizer
以获取树(您的文档)并生成优化的输出树。规则可以是:
请注意,XML方言的树转换可以使用XSLT完成。在你看到光之前,准备好把你的大脑翻过来!
答案 1 :(得分:1)
我们这样做的方法是使用lxml并确定每个元素的父元素和子元素。如果父母和孩子之间没有文本内容差异,那么我们会遵循一套规则来保留某些孩子,同时折腾父母。然后强制使用适当的块元素在你的情况下,b是span,div和td的子节点,我们知道td标签是相关的结构元素,所以我们摆脱了其他元素。同样,这需要测试每个嵌套元素的文本内容。
答案 2 :(得分:0)
您可以使用Jesse Dhillon对this question
的回答的strip_tags
函数
答案 3 :(得分: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
答案 4 :(得分:0)
我喜欢approach suggested by @Daren Thomas,但请注意,删除这些“无用”标签可能会因为JavaScript(不太可能)或CSS(更有可能,甚至可能更有可能)而严重影响文档的呈现外观依赖于生成的HTML来遵循某些结构模式,即使它们是浪费的。
这使得工具编写者的生活更加轻松。假设DOCX中的某些给定构造具有两种可能的变化。其中一个需要很多样板,因此您可以附加一些特殊属性(比如text-align
或其他一些)。另一个没有。更方便的是始终生成样板文件并编写CSS或者记住这个事实。
答案 5 :(得分:0)
如果单独使用美味汤,您可以使用正则表达式。
import re
ch = 'sunny day<td><div><span><b>Patienten</b></span></div></td>rainy week'
# <td><b>Patienten</b></td>
RE = '(<td>)<div><span>(<b>.*?</b>)</span></div>(</td>)'
pat = re.compile(RE)
print ch
print pat.sub('\\1\\2\\3',ch)
结果
sunny day<td><div><span><b>Patienten</b></span></div></td>rainy week
sunny day<td><b>Patienten</b></td>rainy week
容易,不是吗?
可以进行初步检查,以确定是否必须真正进行更换。