繁体   English   中英

python中在XML文件上使用lxml的xpath问题

[英]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>

本课是:

  • 随意忽略文档中的名称空间前缀,它们实际上是辅助信息。 请注意,XML允许在一个文档中多次重复使用相同的名称空间前缀,以用于不同的完全限定的名称空间(吓人的主意,但事实如此)。
  • 注意(好理解)您真正要使用的完全限定名称空间。
  • 具有名称空间前缀和限定名称的字典可以使用您喜欢的任何名称空间前缀。 它与源XML文件中的前缀无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM