为什么etree.find找不到所提供示例的元素

时间:2014-11-07 14:53:47

标签: python xml xml-parsing lxml

让我们假设它有这个:

xml_as_str = '''
<v1:Header>
    <v2:Person>Foo Bar</v2:Person>
    <v2:Email>foo@bar.com</v2:Email>
</v1:Header>
'''

from lxml import etree
tree = etree.fromstring(xml_as_str, etree.XMLParser(recover=True))

如何获得某些标记的值,例如v2:Person的“Foo Bar”?

我试过这个:

 >> tree.find('.//v2:Person')
 >> tree.find('.//{Person}v2')

为了获取元素然后.text,但.find找不到元素,为什么?。

2 个答案:

答案 0 :(得分:2)

使用local-name() xpath函数:

>>> xml_as_str = '''
... <v1:Header>
...     <v2:Person>Foo Bar</v2:Person>
...     <v2:Email>foo@bar.com</v2:Email>
... </v1:Header>
... '''
>>>
>>> from lxml import etree
>>> tree = etree.fromstring(xml_as_str, etree.XMLParser(recover=True))
>>> tree.xpath('//*[local-name()="v2:Person"]/text()')[0]
'Foo Bar'

答案 1 :(得分:0)

你也可以使用BeautifulSoup。

In [1]: from bs4 import BeautifulSoup

In [2]: xml_as_str = '''
   ...: <v1:Header>
   ...:     <v2:Person>Foo Bar</v2:Person>
   ...:     <v2:Email>foo@bar.com</v2:Email>
   ...: </v1:Header>
   ...: '''
In [9]: soup = BeautifulSoup(xml_as_str, 'lxml')
In [15]: for i in soup.find_all('v1:header'):
    ...:     for j in soup.find_all('v2:person'):
    ...:         print(j.text)
    ...:         
Foo Bar

In [16]:

通过列表理解。

In [17]: [j.text for i in soup.find_all('v1:header') for j in soup.find_all('v2:person')][0]
Out[17]: 'Foo Bar'