使用python和ElementTree解析XML

时间:2016-11-02 19:22:45

标签: python xml elementtree

我正在做类项目,我必须保存文本文件的链接列表。

我给了XML并且我正在尝试遍历所有网址但是很麻烦。

我尝试过使用元素树,但是无法迭代我阅读了很多其他问题并尝试了但没有成功。请帮忙

像这样的结构

<urlset xmlns="http://www.crawlingcourse.com/sitemap/1.3">
  <url>
     <loc>
        http://www.crawlingcourse.com/item-3911512
     </loc>
  </url>
<url>....

2 个答案:

答案 0 :(得分:4)

我建议您使用lxml来有效地解析XML文件。

from lxml import etree

您的XML示例格式不正确,我修复了它:

content = """\
<urlset xmlns="http://www.crawlingcourse.com/sitemap/1.3">
  <url>
     <loc>
        http://www.crawlingcourse.com/item-3911512
     </loc>
  </url>
</urlset>"""

要解析文件,您可以使用etree.parse()。但由于此示例是一个字符串,我使用etree.XML()

tree = etree.XML(content)

在XML树中搜索元素的自然方法是使用XPath。例如,你可以这样做:

loc_list = tree.xpath("//url/loc")

但你什么也得不到:

for loc in loc_list:
    print(loc.text)
# None

原因可能是您的问题,<urlset>使用默认命名空间:“http://www.crawlingcourse.com/sitemap/1.3”。

要使其工作,您需要对此命名空间使用xpath()函数。让我们给这个命名空间命名:“s”:

NS = {'s': "http://www.crawlingcourse.com/sitemap/1.3"}

然后,在XPath表达式中使用s前缀,如下所示:

loc_list = tree.xpath("//s:url/s:loc", namespaces=NS)

for loc in loc_list:
    print(loc.text)
#     http://www.crawlingcourse.com/item-3911512

因为您的XML是缩进的,所以您需要去除空格:

for loc in loc_list:
    url = loc.text.strip()
    print(url)
# http://www.crawlingcourse.com/item-3911512

答案 1 :(得分:1)

嗯,问题确实是命名空间。

这是工作代码:

from xml.etree.cElementTree import XML, fromstring, tostring, ElementTree
xml_string = '<?xml version="1.0"?><urlset><url><loc>http://www.crawlingcourse.com/item-3911512</loc></url></urlset>'
tree = ElementTree(fromstring(xml_string))
print [elem.text for elem in tree.iter(tag='loc')]

现在,如果要添加<urlset xmlns="http://www.crawlingcourse.com/sitemap/1.3">,标签将会有所不同。来自http://www.w3schools.com/xml/xml_namespaces.asp

  

XML命名空间 - xmlns属性。在XML中使用前缀时,a   必须定义前缀的名称空间。可以定义名称空间   通过元素的开始标记中的xmlns属性。命名空间   声明具有以下语法。 XMLNS:前缀= “URI”

也把我扔了!