我正在做类项目,我必须保存文本文件的链接列表。
我给了XML并且我正在尝试遍历所有网址但是很麻烦。
我尝试过使用元素树,但是无法迭代我阅读了很多其他问题并尝试了但没有成功。请帮忙
像这样的结构
<urlset xmlns="http://www.crawlingcourse.com/sitemap/1.3">
<url>
<loc>
http://www.crawlingcourse.com/item-3911512
</loc>
</url>
<url>....
答案 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”
也把我扔了!