0

如何从使用 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>'
4

1 回答 1

1

您可以应用与此其他 SO 帖子中所示相同的技术。在这个问题的背景下的例子:

>>> 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>

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

>>> 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>

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

于 2015-03-19T02:57:48.323 回答