2011-03-29 98 views
2

我们通过一些外部转换工具将DOCX转换为HTML。 为表生成的HTML包含这样的事情:删除不必要的内部标签

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

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

预期的结果是

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

是有一些机会,消除他们使用BeautifulSoup一个明智的方法是什么?

+0

http://stackoverflow.com/questions/1765848/remove-a-tag-using-beautifulsoup-but-keep-its-contents/1766002#1766002 – systempuntoout 2011-03-29 15:19:02

回答

1

好杰西Dhillon的答案的strip_tags功能,<div><span>标签具有结构意义,不能被自动猜测为“多余”。

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

  • 跨度(内容) - >内容,如果span.attributes是空
  • DIV(内容) - >内容,如果div.attributes是空

。注意,可以使用XSLT完成XML方言中的树转换。只要准备好在你看到光线之前让你的大脑翻转过来!

+0

在这种特殊情况下,可以通过检查子树。 – 2011-03-29 14:27:00

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 
0

我喜欢approach suggested by @Daren Thomas,但要知道,消除这些“无用”的标签可能严重影响文档感谢的JavaScript渲染的外观(不太可能)或CSS(更有可能,甚至可能),它依赖于生成的HTML来遵循特定的结构模式,即使它们是浪费的。

这使得工具作家的生活更容易。假设DOCX中的某个给定构造有两种可能的变体。其中之一需要大量样板,以便您可以附加一些特殊属性(例如text-align或其他一些)。另一个没有。只要总是生成样板文件并写出你的CSS或者你想到的事实,那会更容易。

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 

简单,easyn't呢?

可以进行初步检查以确定替换是否必须完成。

1

我们这样做的方式是使用lxml并确定每个元素的父母和孩子。如果父母和孩子之间没有文本内容差异,那么我们就有一套规则来保留某些孩子,同时抛弃父母。然后强制适当的块元素在你的情况b是span,div和td的子元素,我们知道td标签是相关的结构元素,所以我们摆脱了其他元素。这又需要测试每个嵌套元素的文本内容。