[英]Parse an xml file to extract element values using lxml and XPath in python
[英]problems with xpath in python using lxml on xml file
我正在尝试从rss提要中解析一些数据。 这是外观的一个例子
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:admin="http://webns.net/mvcb/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/">
<channel rdf:about="http://somelink.com">
<!-- ordinary stuff goes here -->
</channel>
<item rdf:about="http://www.some/random/link/123">
<title>title</title>
<link>
http://www.some/random/link/123
</link>
<description>
<![CDATA[
..description..
]]>
</description>
<dc:date>the date</dc:date>
</item>
</rdf:RDF>
现在,我正在尝试从rss提要中获取每个item元素,这对于普通的提要来说是没有问题的,但是我似乎无法从该提要中获得任何东西。 它只是返回一个空列表。
这是我正在使用的代码:
from lxml import etree
tree = etree.parse(url)
items = tree.xpath("//item")
它与开始处的rdf:RDF或每个项目标签中的rdf:about = ....有关吗?
以防万一:
-文件至少正在加载,因为etree.tostring(tree)
确实产生了整个文件。
-我尝试使用nsmap = tree.getroot().nsmap()
,但是我不知道我是否做对了
-在常规的rss提要中, tree.getroot()
产生-> <Element rss at 0x2fa4260>
,但是在此文件上,它产生-> <Element {http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF at 0x2fa4288>
一旦开始使用名称空间(甚至是空的名称空间前缀),您就必须在xpath
非常明确地说明您所使用的名称空间。
为此, lxml
提供了一个字典,其中键是名称空间前缀(随便您喜欢什么),值是各自的名称空间(全限定名):
from lxml import etree
xmlstr = """
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://purl.org/rss/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:syn="http://purl.org/rss/1.0/modules/syndication/">
<channel rdf:about="http://somelink.com">
<!-- ordinary stuff goes here -->
</channel>
<item rdf:about="http://www.some/random/link/123">
<title>title</title>
<link>
http://www.some/random/link/123
</link>
<description>
<![CDATA[
..description..
]]>
</description>
<dc:date>the date</dc:date>
</item>
</rdf:RDF>"""
xmldoc = etree.fromstring(xmlstr)
nsmap = {"purl": "http://purl.org/rss/1.0/"}
res = xmldoc.xpath("//purl:item", namespaces=nsmap)
print res
print "xml", etree.tostring(res[0])
运行这样的代码打印:
[<Element {http://purl.org/rss/1.0/}item at 0x7fc8fb20af80>]
xml <item xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:admin="http://webns.net/mvcb/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" rdf:about="http://www.some/random/link/123">
<title>title</title>
<link>
http://www.some/random/link/123
</link>
<description>
..description..
</description>
<dc:date>the date</dc:date>
</item>
本课是:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.