使用 python 和 ElementTree 解析 XML

Parsing XML with python and ElementTree

我正在做 class 项目,我必须在其中保存指向文本文件的链接列表。

我给出了 XML 并且正在尝试 遍历所有 url 的 但我遇到了麻烦。

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

这样的结构

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

我建议您使用 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

好吧,问题确实出在命名空间上。

这是工作代码:

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 Namespaces - The xmlns Attribute. When using prefixes in XML, a namespace for the prefix must be defined. The namespace can be defined by an xmlns attribute in the start tag of an element. The namespace declaration has the following syntax. xmlns:prefix="URI".

也把我甩了!