通过“ElementTree”解析Python中具有命名空间的XML

我想使用Python的ElementTree解析以下XML:

<rdf:rdf xml:base=”http://dbpedia.org/ontology/"
xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl=”http://www.w3.org/2002/07/owl#"
xmlns:xsd=”http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#"
xmlns=”http://dbpedia.org/ontology/“>
<owl:Class rdf:about=”http://dbpedia.org/ontology/BasketballLeague“>
<rdfs:label xml:lang=“en”>篮球联赛&lt/rdfs:标签>
<rdfs:comment-xml:lang=“en”>
互相竞争的一组运动队
打篮球
&lt/rdfs:评论>
&lt/猫头鹰:类>
&lt/rdf:rdf>

我想找到所有owl:Class标记,然后提取其中所有rdfs:label实例的值。我正在使用以下代码:

tree=ET.parse(“文件名”)
root=tree.getroot()
root.findall('owl:Class')

由于名称空间的原因,我得到以下错误

语法错误:在前缀映射中找不到前缀“owl”

我试着在家里读文件http://effbot.org/zone/element-namespaces.htm 但是我仍然无法实现这一点,因为上面的XML有多个嵌套的名称空间

请告诉我如何更改代码以查找所有的owl:Class标记

您需要为.find()findall()iterfind()方法提供一个显式的命名空间字典:

名称空间={'owl':'http://www.w3.org/2002/07/owl#'}#根据需要添加更多
findall('owl:Class',名称空间)

前缀仅在传入的名称空间参数中查找。这意味着您可以使用任何您喜欢的名称空间前缀;API分离了owl:部分,在namespaces字典中查找相应的名称空间URL,然后更改搜索以查找XPath表达式{http://www.w3.org/2002/07/owl}类。当然,您也可以自己使用相同的语法:

root.findall('{http://www.w3.org/2002/07/owl#}类')

另请参见ElementTree文档的使用名称空间解析XML部分

如果你能切换到lxml库,事情会更好;该库支持相同的ElementTree API,但在元素的.nsmap属性中为您收集名称空间,并且通常具有更好的名称空间支持

发表评论