我们通过一些外部转换工具将DOCX转换为HTML。 为表生成的HTML包含这样的事情:删除不必要的内部标签
<td><div><span><b>Patienten</b></span></div></td>
内TD的<div>
和<span>
标签是完全多余这里。
预期的结果是
<td><b>Patienten</b></td>
是有一些机会,消除他们使用BeautifulSoup一个明智的方法是什么?
我们通过一些外部转换工具将DOCX转换为HTML。 为表生成的HTML包含这样的事情:删除不必要的内部标签
<td><div><span><b>Patienten</b></span></div></td>
内TD的<div>
和<span>
标签是完全多余这里。
预期的结果是
<td><b>Patienten</b></td>
是有一些机会,消除他们使用BeautifulSoup一个明智的方法是什么?
你可以使用的this question
好杰西Dhillon的答案的strip_tags
功能,<div>
和<span>
标签具有结构意义,不能被自动猜测为“多余”。
您的问题与编译器中完成的AST(抽象语法树)优化看起来非常相似。您可以尝试定义一些规则并构建一个树(您的文档)并生成优化的输出树。规则可以是:
。注意,可以使用XSLT完成XML方言中的树转换。只要准备好在你看到光线之前让你的大脑翻转过来!
在这种特殊情况下,可以通过检查子树。 – 2011-03-29 14:27:00
你能重新解析树是这样的:
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
我喜欢approach suggested by @Daren Thomas,但要知道,消除这些“无用”的标签可能严重影响文档感谢的JavaScript渲染的外观(不太可能)或CSS(更有可能,甚至可能),它依赖于生成的HTML来遵循特定的结构模式,即使它们是浪费的。
这使得工具作家的生活更容易。假设DOCX中的某个给定构造有两种可能的变体。其中之一需要大量样板,以便您可以附加一些特殊属性(例如text-align
或其他一些)。另一个没有。只要总是生成样板文件并写出你的CSS或者你想到的事实,那会更容易。
如果只有美丽的汤是不够的,你可以诉诸正则表达式。
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呢?
可以进行初步检查以确定替换是否必须完成。
我们这样做的方式是使用lxml并确定每个元素的父母和孩子。如果父母和孩子之间没有文本内容差异,那么我们就有一套规则来保留某些孩子,同时抛弃父母。然后强制适当的块元素在你的情况b是span,div和td的子元素,我们知道td标签是相关的结构元素,所以我们摆脱了其他元素。这又需要测试每个嵌套元素的文本内容。
http://stackoverflow.com/questions/1765848/remove-a-tag-using-beautifulsoup-but-keep-its-contents/1766002#1766002 – systempuntoout 2011-03-29 15:19:02