【问题标题】:Parsing XML with python and ElementTree使用 python 和 ElementTree 解析 XML
【发布时间】:2017-03-16 05:55:28
【问题描述】:

我正在做课堂项目,我必须将链接列表保存到文本文件。

我给出了 XML 并试图遍历所有 url 的,但我遇到了麻烦。

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

这样的结构

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

【问题讨论】:

  • 到目前为止你的代码是什么样的?它在什么方面不起作用?
  • 从示例中,只是想确保您的 XML 是正确的(所有元素都已关闭、doctype 等)?

标签: python xml elementtree


【解决方案1】:

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

原因(可能是您的问题)是 &lt;urlset&gt; 使用默认命名空间:“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

【讨论】:

  • 感谢@Laurent 花时间解释。你解决了我的问题并教会了我它是如何工作的。谢谢你
【解决方案2】:

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

这是工作代码:

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')]

现在,如果你想添加&lt;urlset xmlns="http://www.crawlingcourse.com/sitemap/1.3"&gt;,标签会有所不同。来自http://www.w3schools.com/xml/xml_namespaces.asp

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

把我也甩了!

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多