7

我完全不明白为什么 lxml.text会给我一个子标签的文本,而不是根标签的文本。

some_tag = etree.fromstring('<some_tag class="abc"><strong>Hello</strong> World</some_tag>')

some_tag.find("strong")
Out[195]: <Element strong at 0x7427d00>

some_tag.find("strong").text
Out[196]: 'Hello'

some_tag
Out[197]: <Element some_tag at 0x7bee508>

some_tag.text

some_tag.find("strong").text<strong>返回标签之间的文本。

我希望some_tag.text返回之间的一切<some_tag> ... </some_tag>

预期的:

<strong>Hello</strong> World

相反,它什么也不返回。

4

5 回答 5

9
from lxml import etree

XML = '<some_tag class="abc"><strong>Hello</strong> World</some_tag>'

some_tag = etree.fromstring(XML)

for element in some_tag:
    print element.tag, element.text, element.tail

输出:

strong Hello  World

有关.text.tail属性的信息,请参阅:

要准确获得您预期的结果,请使用

print etree.tostring(some_tag.find("strong"))

输出:

<strong>Hello</strong> World
于 2012-04-21T17:58:23.603 回答
1

您将在此处找到缺少的文本

>>> some_tag.find("strong").tail
' World'

查看http://lxml.de/tutorial.html并搜索“tail”。

于 2012-04-21T12:19:40.707 回答
0

我不确定是否理解您的问题,但您在解析中有 2 个主要解决方案:

DOMParser :取决于语言,它是 node.getNodeValue();

SAXParser:取决于语言,但在 java 中,例如在函数中:characters(...)

我没有时间在谷歌上搜索,但在 python 中,我知道 MiniDOM(一个 DOM 解析器): http: //www.blog.pythonlibrary.org/2010/11/12/python-parsing-xml-with-minidom /

希望我的回答能帮到你。

于 2012-04-21T11:59:49.967 回答
0

这有帮助吗?

comp = [ etree.tostring(e) for e in some_tag]
print ''.join(comp[0])

已编辑:感谢@mzjin 让我走上正轨

于 2012-04-21T13:40:47.190 回答
0

您必须使用内置的 lxml 方法来检索标签之间的所有文本。

  from lxml import etree
  xml='''<some_tag class="abc"><strong>Hello</strong> World</some_tag>'''
  tree = etree.fromstring(xml)
  print(''.join(tree.xpath('//text()')))
于 2017-07-10T10:59:31.603 回答