使用Python中的Elementtree解析RSS

Cer*_*rin 7 python xml rss elementtree

如何使用Python中的Elementtree在XML中搜索特定于命名空间的标记?

我有一个XML/RSS文档,如:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:wp="http://wordpress.org/export/1.0/"
>
<channel>
    <title>sometitle</title>
    <pubDate>Tue, 28 Aug 2012 22:36:02 +0000</pubDate>
    <generator>http://wordpress.org/?v=2.5.1</generator>
    <language>en</language>
    <wp:wxr_version>1.0</wp:wxr_version>
    <wp:category><wp:category_nicename>apache</wp:category_nicename><wp:category_parent></wp:category_parent><wp:cat_name><![CDATA[Apache]]></wp:cat_name></wp:category>
</channel>
</rss>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试通过执行以下操作找到所有"wp:category"标签时:

import xml.etree.ElementTree as xml
tree = xml.parse(fn)
doc = tree.getroot()
categories = doc.findall('channel/wp:category')
Run Code Online (Sandbox Code Playgroud)

我收到错误:

SyntaxError: prefix 'wp' not found in prefix map
Run Code Online (Sandbox Code Playgroud)

搜索任何非命名空间特定字段都可以正常工作.我究竟做错了什么?

Tom*_*Tom 3

您需要处理名称空间前缀,方法是使用 iterparse 并直接处理事件,或者在解析之前显式声明您感兴趣的前缀。根据您想要做什么,我承认在我比较懒的时候,我只是在解析 XML 之前用字符串替换去掉所有前缀。

编辑:这个类似的问题可能会有所帮助。

  • 这毫无意义。命名空间前缀在父 &lt;rss&gt; 标记中定义。我不必预先解析我的 RSS 文档,这样我就可以将命名空间提供给我的 RSS 解析器... (2认同)
  • 我不是在和你争论,我只是说我就是这样解决的。 (2认同)