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

我有这个 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>

当我尝试使用lxml并遵循xpath 和 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 的停电控制室内 []


由于它正确地找到了标题标签的内容,我认为它正在寻找单个<item>标签。我将命名空间传递给的方式有问题xpath吗?


编辑:无论我是否使用斜杠,结果都是相同的,即


ns = {"dc" : "http://purl.org/dc/elements/1.1/"}

ns = {"dc" : "http://purl.org/dc/elements/1.1"}


MYYA
浏览 106回答 1
1回答

Smart猫小萌

HTML 解析器忽略名称空间。这是lxml 文档的Running HTML doctests部分的最后一句话:HTML 解析器明显忽略了名称空间和其他一些 XMLisms。文档的另一部分说:另请注意,HTML 解析器旨在解析 HTML 文档。对于 XHTML 文档,使用可识别名称空间的 XML 解析器。如果你改变它会起作用authors&nbsp;=&nbsp;item.xpath("dc:creator",&nbsp;namespaces&nbsp;=&nbsp;ns)至authors&nbsp;=&nbsp;item.xpath("creator")但由于 RSS 不是 HTML,请考虑使用 XML 解析器 (&nbsp;from lxml import etree)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python