【问题标题】:How could I get (print) all inner html from node which I select using python's lxml etree and xpath?如何从我使用 python 的 lxml etree 和 xpath 选择的节点获取(打印)所有内部 html?
【发布时间】:2015-05-21 14:47:26
【问题描述】:

如何从我使用 etree xpath 选择的节点获取所有内部 html:

>>> from lxml import etree
>>> from StringIO import StringIO
>>> doc = '<foo><bar><div>привет привет</div></bar></foo>'
>>> hparser = etree.HTMLParser()
>>> htree = etree.parse(StringIO(doc), hparser)
>>> foo_element = htree.xpath("//foo")

我现在如何将所有 foo_element 的内部 HTML 打印为文本?我需要得到这个:

<bar><div>привет привет</div></bar>

顺便说一句,当我尝试使用 lxml.html.tostring 时,我得到了奇怪的输出:

>>> import lxml.etree
>>> lxml.html.tostring(foo_element[0])
'<foo><bar><div>&#208;&#191;&#209;&#128;&#208;&#184;&#208;&#178;&#208;&#181;&#209;&#130; &#208;&#191;&#209;&#128;&#208;&#178;&#208;&#184;&#208;&#181;&#209;&#130;</div></bar></foo>'

【问题讨论】:

    标签: python xpath html-parsing lxml xml.etree


    【解决方案1】:

    您可以应用与this other SO post 中所示相同的技术。此问题上下文中的示例:

    >>> from lxml import etree
    >>> from lxml import html
    >>> from StringIO import StringIO
    >>> doc = '<foo><bar><div>TEST NODE</div></bar></foo>'
    >>> hparser = etree.HTMLParser()
    >>> htree = etree.parse(StringIO(doc), hparser)
    >>> foo_element = htree.xpath("//foo")
    >>> print ''.join(html.tostring(e) for e in foo_element[0])
    <bar><div>TEST NODE</div></bar>
    

    或处理元素可能包含文本节点子节点的情况:

    >>> doc = '<foo>text node child<bar><div>TEST NODE</div></bar></foo>'
    >>> htree = etree.parse(StringIO(doc), hparser)
    >>> foo_element = htree.xpath("//foo")
    >>> print foo_element[0].text + ''.join(html.tostring(e) for e in foo_element[0])
    text node child<bar><div>TEST NODE</div></bar>
    

    强烈建议将代码重构为链接帖子中所示的单独函数以用于实际案例。

    【讨论】:

    • 谢谢。该解决方案为非拉丁字符提供了不可读的输出'&lt;foo&gt;&lt;bar&gt;&lt;div&gt;&amp;#208;&amp;#191;&amp;#209;&amp;#128;&amp;#208;&amp;#184;&amp;#208;&amp;#178;&amp;#208;&amp;#181;&amp;#209;&amp;#130; &amp;#208;&amp;#191;&amp;#209;&amp;#128;&amp;#208;&amp;#178;&amp;#208;&amp;#184;&amp;#208;&amp;#181;&amp;#209;&amp;#130;&lt;/div&gt;&lt;/bar&gt;&lt;/foo&gt;' 有没有办法让它成为人类可读的?
    • 抱歉,我对此无能为力,因为我什至无法将此类非拉丁字符分配给 IDLE 中的 doc 变量(得到“输入中不支持的字符”错误信息)。从问题标题来看,我认为这应该放在单独的问题中。这是一个完全不同的问题。
    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多