【问题标题】:Why does lxml.html sometimes swallow/remove whitespace instead of preserving it?为什么 lxml.html 有时会吞下/删除空格而不是保留它?
【发布时间】:2016-03-15 06:23:38
【问题描述】:

鉴于以下代码,人们可能会合理地期望输入 lxml 的 HTML 字符串几乎完全相同。

from lxml import html

HTML_TEST_STRING = r"""
<pre>
<em>abc</em>

<em>def</em>

<sub>ghi</sub>

<sub>jkl</sub>

<em>mno</em>

<em>pqr</em>

</pre>
"""

parser = html.HTMLParser( remove_blank_text=False )
doc = html.fromstring( HTML_TEST_STRING, parser=parser )
print( html_out_string )

相反,即使所有内容都包含在 &lt;pre&gt; 预格式化的代码块中,并且 remove_blank_text 标志设置为 False它只尊重 某些 的内容,但神秘地 用于内容的其他部分。请参阅下面的上述代码的意外输出:

<pre>
<em>abc</em>

<em>def</em>

<sub>ghi</sub><sub>jkl</sub><em>mno</em>

<em>pqr</em>

</pre>

具体来说,每当 lxml 遇到 &lt;sub&gt; 标记时,它就会变得笨拙并丢失 sub 元素后面的“尾部”文本内容即使那个“sub element”可以说甚至不是一个元素——因为它被包裹在一个pre元素中)。

【问题讨论】:

    标签: lxml libxml2 lxml.html


    【解决方案1】:

    这种奇怪行为的最可能催化剂是,像我一样,你在 Windows 上并且使用 lxml 不为其发布二进制包的 Python 版本。

    在这种情况下,one portion of the lxml website 将您指向official unofficial Windows binaries for libxml2,以便您[可能通过 pip 安装脚本] 可以构建一个支持 您的 Python 版本的新 lxml 二进制文件。然而,问题在于它链接到您的二进制文件至少有 4 年的历史并且包含您遇到的错误。

    解决此问题的最简单方法是下载并安装实际为您的 OS/Python 变体构建的 lxml 的 Christoph Gohlke's unofficial binary archive(所谓的“轮子”)。 (lxml 网站的另一部分也建议这样做,但如果您像我一样,忽略了该路径,希望尽可能少地运行非官方二进制代码。)

    (例如pip3 install --upgrade lxml-3.5.0-cp35-none-win32.whl

    Golke 的软件包是使用更新版本的 libxml2 构建的,该版本显然已经修复了该错误,因此如果上述一切正常,您现在就可以停止浪费生命中的时间来寻找错误的“树”。 您没有使用 lxml 错误,也不是 lxml 不支持在这种情况下保留空格 (正如许多其他 SO 条目可能有你认为的那样); 只是您无意中使用了一个已修复错误的 libxml2 版本。

    随着最近构建的 libxml2 驱动您的 lxml 安装,您发布的示例代码的输出将产生您所期望的(始终保留的空白):

    <pre>
    <em>abc</em>
    
    <em>def</em>
    
    <sub>ghi</sub>
    
    <sub>jkl</sub>
    
    <em>mno</em>
    
    <em>pqr</em>
    
    </pre>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2019-09-04
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多