我正在开发一个用 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 sells sea shells”结尾的尾随空格曾经属于 DM_57273 节点,但最终附加到 DM_57134 节点。
所以问题是:
- 为什么要这样做?
- 有什么方法可以防止以这种方式处理尾随空格?
我不知道为什么会发生这种情况,但 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 '
可以看出,对于与问题中相同的示例,尾随空格仍然是标记的一部分。
我是一名优秀的程序员,十分优秀!