如何用python解析带有命名空间的xml文件

时间:2022-09-08 09:12:51
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:db="http://www.douban.com/xmlns/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/">
<title>阿北 的朋友</title>
<author>
<link href="http://api.douban.com/people/ahbei" rel="self"/>
<link href="http://www.douban.com/people/ahbei/" rel="alternate"/>
<link href="http://t.douban.com/icon/u1000001-14.jpg" rel="icon"/>
<name>阿北</name>
<uri>http://api.douban.com/people/1000001</uri>
</author>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage>2</opensearch:itemsPerPage>
<opensearch:totalResults>114</opensearch:totalResults>
<entry>
<id>http://api.douban.com/people/1010394</id>
<title>Engo@寻各种达人</title>
<link href="http://api.douban.com/people/1010394" rel="self"/>
<link href="http://www.douban.com/people/akin/" rel="alternate"/>
<link href="http://t.douban.com/icon/u1010394-10.jpg" rel="icon"/>
<link href="http://www.halfull.cn" rel="homepage"/>
<content>但行好事,莫问前程。

http://www.douban.com/group/topic/3750385/ 寻各种达人

我的"朋友"
那会是已经认识很久或将要认识并能持续很久的人,谢谢。</content>

<db:location id="beijing">北京</db:location>
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:db="http://www.douban.com/xmlns/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/">
<title>阿北 的朋友</title>
<author>
<link href="http://api.douban.com/people/ahbei" rel="self"/>
<link href="http://www.douban.com/people/ahbei/" rel="alternate"/>
<link href="http://t.douban.com/icon/u1000001-14.jpg" rel="icon"/>
<name>阿北</name>
<uri>http://api.douban.com/people/1000001</uri>
</author>
<opensearch:startIndex>1</opensearch:startIndex>
<opensearch:itemsPerPage>2</opensearch:itemsPerPage>
<opensearch:totalResults>114</opensearch:totalResults>
<entry>
<id>http://api.douban.com/people/1010394</id>
<title>Engo@寻各种达人</title>
<link href="http://api.douban.com/people/1010394" rel="self"/>
<link href="http://www.douban.com/people/akin/" rel="alternate"/>
<link href="http://t.douban.com/icon/u1010394-10.jpg" rel="icon"/>
<link href="http://www.halfull.cn" rel="homepage"/>
<content>但行好事,莫问前程。

http://www.douban.com/group/topic/3750385/ 寻各种达人

我的"朋友"
那会是已经认识很久或将要认识并能持续很久的人,谢谢。</content>

<db:location id="beijing">北京</db:location>
<db:uid>akin</db:uid>
</entry>
<entry>
<id>http://api.douban.com/people/1276180</id>
<title>蒜王子(((♪)))</title>
<link href="http://api.douban.com/people/1276180" rel="self"/>
<link href="http://www.douban.com/people/movie007wn/" rel="alternate"/>
<link href="http://t.douban.com/icon/u1276180-40.jpg" rel="icon"/>
<content>♂┣▇▇▇═—。
ருவசிர்ம்ர்ளேசி</content>
<db:location id="beijing">北京</db:location>
<db:uid>movie007wn</db:uid>
</entry>
</feed> </entry>
<entry>
<id>http://api.douban.com/people/1276180</id>
<title>蒜王子(((♪)))</title>
<link href="http://api.douban.com/people/1276180" rel="self"/>
<link href="http://www.douban.com/people/movie007wn/" rel="alternate"/>
<link href="http://t.douban.com/icon/u1276180-40.jpg" rel="icon"/>
<content>♂┣▇▇▇═—。
ருவசிர்ம்ர்ளேசி</content>
<db:location id="beijing">北京</db:location>
<db:uid>movie007wn</db:uid>
</entry>
</feed>
如何用python提取节点<db:uid>里的内容?

3 个解决方案

#1


# 文档用问题吧,中间还有<xml???????
from xml.sax import *
from xml.sax.handler import *

class Handler(ContentHandler):
    def __init__(self, *args):
        super().__init__(*args)
        self.in_uid = False
    def startElement(self, name, attrs):
        if name == "db:uid":
            self.in_uid = True
    def characters(self, data):
        if self.in_uid:
            self.data = data
    def endElement(self, name):
        if name == "db:uid":
            print(self.data)
            self.data = None
f = open("xmlfile.xml", encoding = "utf8")
parse(f, Handler())

#2


谢谢!那用xml.etree.ElementTree或Xpath怎么表达呢?

#3


这个ET真的很TMD变态,我也被它搞的很头大,而且它的作者也很NB,根据不听取大家的意见坚持不改
不过你的问题是可以解决的
直接p=root.find("{http://www.douban.com/xmlns/}uid"}是可以的

我希望ET不要处理namespace,有没有人有经验的呢?

#1


# 文档用问题吧,中间还有<xml???????
from xml.sax import *
from xml.sax.handler import *

class Handler(ContentHandler):
    def __init__(self, *args):
        super().__init__(*args)
        self.in_uid = False
    def startElement(self, name, attrs):
        if name == "db:uid":
            self.in_uid = True
    def characters(self, data):
        if self.in_uid:
            self.data = data
    def endElement(self, name):
        if name == "db:uid":
            print(self.data)
            self.data = None
f = open("xmlfile.xml", encoding = "utf8")
parse(f, Handler())

#2


谢谢!那用xml.etree.ElementTree或Xpath怎么表达呢?

#3


这个ET真的很TMD变态,我也被它搞的很头大,而且它的作者也很NB,根据不听取大家的意见坚持不改
不过你的问题是可以解决的
直接p=root.find("{http://www.douban.com/xmlns/}uid"}是可以的

我希望ET不要处理namespace,有没有人有经验的呢?