ElementTree / TidyHTMLTreeBuilder在我的文本中修改了尾随空格

时间:2012-01-15 21:02:00

标签: python xml

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

所以问题是:

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

1 个答案:

答案 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 '

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