让我们假设它有这个:
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
找不到元素,为什么?。
答案 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'