Skip to main content
 首页 » 编程设计

python之ElementTree/TidyHTMLTreeBuilder 弄乱了我文本中的尾随空格

2025年05月04日25三少

我正在开发一个用 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 节点。

所以问题是:

  1. 为什么要这样做?
  2. 有什么方法可以防止以这种方式处理尾随空格?

请您参考如下方法:

我不知道为什么会发生这种情况,但 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 ' 

可以看出,对于与问题中相同的示例,尾随空格仍然是标记的一部分。