我建议你使用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"}
然后,使用s
前缀的XPath表达式是这样的:
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
你的代码到目前为止是什么样的?它以什么方式不起作用? – larsks
从示例中,只是想确保您的XML是正确的(所有元素关闭,文档类型等)? – Eugene