Я предлагаю вам использовать 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 правильный (все элементы закрыты, doctype и т. Д.)? – Eugene