删除不必要的内标签

时间:2011-03-29 14:14:58

标签: python html beautifulsoup

我们正在通过一些外部转换器工具将DOCX转换为HTML。 生成的表格HTML包含如下内容:

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

TD内的<div><span>标签在这里完全是多余的。

预期结果是

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

有没有机会使用BeautifulSoup以理智的方式删除它们?

6 个答案:

答案 0 :(得分:1)

好吧,<div><span>标签具有结构意义,不能自动猜到“多余”。

您的问题看起来与编译器中完成的AST(抽象语法树)优化非常相似。您可以尝试定义一些规则并构建SoupOptimizer以获取树(您的文档)并生成优化的输出树。规则可以是:

  • span(内容) - &gt; content,如果span.attributes为空
  • div(内容) - &gt; content,如果div.attributes为空

请注意,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

容易,不是吗?

可以进行初步检查,以确定是否必须真正进行更换。