lxml 解析原子 - 空结果?
lxml parsing atom - empty results?
我正在尝试从 atom_sample.xml 中获取标题和链接,我附加了与其他 rss 提要相同的代码。
from lxml import etree
tree = etree.parse('atom_sample.xml')
root = tree.getroot()
titles = root.xpath('//entry/title/text()')
links = root.xpath('//entry/link/@href')
print(titles)
print(links)
结果:
[]
[]
使用来自 的其他 rss 文件,这工作完美无缺。
我认为您的问题是 lxml.etree
使用 xml 命名空间 {http://www.w3.org/2005/Atom}
:
解析您的 xml 文件
In [1]: from lxml import etree
...: tree = etree.parse('atom_sample.xml')
...: root = tree.getroot()
In [2]: root
Out[2]: <Element {http://www.w3.org/2005/Atom}feed at 0x7f198e8da808>
我不确定如何轻松摆脱这个命名空间,但您可以尝试 this 问题的答案之一。
无论如何,作为一个 workarrond,我使用将 <namespace>:<tag>
添加到 xpath 的每个部分,并使用 xpath
方法和 namespaces
字典作为参数。例如:
In [4]: namespaces = {'atom':'http://www.w3.org/2005/Atom'}
In [5]: root.xpath('//atom:entry/atom:title/text()', namespaces=namespaces)
Out[5]:
['sample.00',
'sample.01',
'sample.02',
'sample.03',
'sample.04',
'sample.05',
'sample.06',
'sample.07',
'sample.08',
'sample.09',
'sample.10']
In [6]: root.xpath('//atom:entry/atom:link/@href', namespaces=namespaces)
Out[6]:
['https://myfeedurl.com/feed/00',
'https://myfeedurl.com/feed/01',
'https://myfeedurl.com/feed/02',
'https://myfeedurl.com/feed/03',
'https://myfeedurl.com/feed/04',
'https://myfeedurl.com/feed/05',
'https://myfeedurl.com/feed/06',
'https://myfeedurl.com/feed/07',
'https://myfeedurl.com/feed/08',
'https://myfeedurl.com/feed/09',
'https://myfeedurl.com/feed/10']
我正在尝试从 atom_sample.xml 中获取标题和链接,我附加了与其他 rss 提要相同的代码。
from lxml import etree
tree = etree.parse('atom_sample.xml')
root = tree.getroot()
titles = root.xpath('//entry/title/text()')
links = root.xpath('//entry/link/@href')
print(titles)
print(links)
结果: [] []
使用来自
我认为您的问题是 lxml.etree
使用 xml 命名空间 {http://www.w3.org/2005/Atom}
:
In [1]: from lxml import etree
...: tree = etree.parse('atom_sample.xml')
...: root = tree.getroot()
In [2]: root
Out[2]: <Element {http://www.w3.org/2005/Atom}feed at 0x7f198e8da808>
我不确定如何轻松摆脱这个命名空间,但您可以尝试 this 问题的答案之一。
无论如何,作为一个 workarrond,我使用将 <namespace>:<tag>
添加到 xpath 的每个部分,并使用 xpath
方法和 namespaces
字典作为参数。例如:
In [4]: namespaces = {'atom':'http://www.w3.org/2005/Atom'}
In [5]: root.xpath('//atom:entry/atom:title/text()', namespaces=namespaces)
Out[5]:
['sample.00',
'sample.01',
'sample.02',
'sample.03',
'sample.04',
'sample.05',
'sample.06',
'sample.07',
'sample.08',
'sample.09',
'sample.10']
In [6]: root.xpath('//atom:entry/atom:link/@href', namespaces=namespaces)
Out[6]:
['https://myfeedurl.com/feed/00',
'https://myfeedurl.com/feed/01',
'https://myfeedurl.com/feed/02',
'https://myfeedurl.com/feed/03',
'https://myfeedurl.com/feed/04',
'https://myfeedurl.com/feed/05',
'https://myfeedurl.com/feed/06',
'https://myfeedurl.com/feed/07',
'https://myfeedurl.com/feed/08',
'https://myfeedurl.com/feed/09',
'https://myfeedurl.com/feed/10']