为什么此解析器找不到使用命名空间前缀的XML标记的内容?

问题描述 投票:0回答:1

我有这个XML代码,取自this link

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:nyt="http://www.nytimes.com/namespaces/rss/2.0" version="2.0">
  <channel>
    <item>
      <title>‘This Did Not Go Well’: Inside PG&amp;E’s Blackout Control Room</title>
      <dc:creator>Ivan Penn</dc:creator>
      <pubDate>Sat, 12 Oct 2019 17:03:11 +0000</pubDate>
    </item>
  </channel>
</rss>

[当我尝试使用lxml并在documentation for xpath and XML namespaces之后解析它时,解析器会找到标题(不使用名称空间),但找不到作者/创建者,但会:

from lxml import html

xml = """
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:nyt="http://www.nytimes.com/namespaces/rss/2.0" version="2.0">
  <channel>
    <item>
      <title>‘This Did Not Go Well’: Inside PG&amp;E’s Blackout Control Room</title>
      <dc:creator>Ivan Penn</dc:creator>
      <pubDate>Sat, 12 Oct 2019 17:03:11 +0000</pubDate>
    </item>
  </channel>
</rss>
"""


rss = html.fromstring(xml)
items = rss.xpath("//item")
for item in items:
    title = item.xpath("title")[0].text_content().strip()
    print(title)

    ns = {"dc" : "http://purl.org/dc/elements/1.1"}
    authors = item.xpath("dc:creator", namespaces = ns)
    print(authors)

此代码打印:

此操作进展不顺利:在PG&E的停电控制室中[]

因为它可以正确找到title标签的内容,所以我认为它是在查找单个<item>标签。我如何将名称空间传递给xpath有问题吗?

python xml xpath lxml xml-namespaces
1个回答
0
投票

我想这很简单,因为您没有使用相同的名称空间URI,但却忘记了名称空间在输入中的结尾斜线,因此请尝试

ns = {"dc" : "http://purl.org/dc/elements/1.1/"}
© www.soinside.com 2019 - 2024. All rights reserved.