我正在开发一个用Python编写的应用程序,它接受来自浏览器托管的HTML编辑器的HTML。应用程序将此HTML加载到ElementTree文档中,以便使用TidyHTMLTreeBuilder作为解析器进行处理。我发现的问题是XML文档认为适合重新组织节点,以便节点(例如,SPAN)上的任何尾随空格被添加到节点的尾部。除了将空格添加到更高级别的节点之外,这并不是那么糟糕。我正在进行的处理需要使用节点的CSS样式来识别文本部分,因此移动该空间会导致问题。
这是一个实际的例子:
摘自HTML的摘录:
<td style="width: 4.7729in; padding-top: 0.0000in; padding-left: 0.0556in; padding-bottom: 0.0000in; padding-right: 0.0556in; border-width: 1px; border-color: #FDD87B; border-style: solid;">
<p style="padding-top: 0.0833in; padding-bottom: 0.0833in;">
<span style="font-family: Verdana,Geneva,Tahoma,sans-serif; font-size: 10.0pt;">
<span id="DM_57134" class="defn_meaning">
<span id="DM_57133" class="defn_meaning">
<span id="DM_57273" class="defn_meaning">Sally sells sea shells </span>
</span>
</span>
<a class="popup" href="ID_57274" target="_blank">
<span id="DM_57134_1" class="defn_meaning">
<span id="DM_57133_1" class="defn_meaning">
<span id="DM_57273_1" class="defn_meaning">by the sea shore</span>
</span>
</span>
</a>
</span>
</p>
</td>
树按如下方式加载:
[td "\n" (
[p (
[span (
[span id="DM_57134"
(
[span id="DM_57133"
(
[span id="DM_57273" "Sally sells sea shells" ()]
)
]
) tail=" "
]
[a (
[span id="DM_57134_1"
(
[span id="DM_57133_1"
(
[span id="DM_57273_1" "by the sea shore" ()]
)
]
)
])
])
]) tail="\n"
]) tail="\n"])
tail="\n"]
正如您所看到的,“Sally出售海贝壳”ed的尾随空间曾经属于DM_57273节点,但最终被连接到DM_57134节点。
所以问题是:
答案 0 :(得分:0)
我不知道为什么会发生这种情况,但TidyHTMLTreeBuilder + ElementTree的另一种选择可能对您有用BeautifulSoup。例如:
>>> from BeautifulSoup import BeautifulSoup
>>> soup = BeautifulSoup(<html>)
>>> soup.find(id='DM_57273')
<span id="DM_57273" class="defn_meaning">Sally sells sea shells </span>
>>> soup.find(id='DM_57273').string
u'Sally sells sea shells '
可以看出,对于与问题中相同的示例,尾随空格仍然是标记的一部分。