我建議你使用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