2 回答
TA贡献1830条经验 获得超3个赞
对您的代码的(不雅)修复是:
import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
# In find/findall, prefix namespaced tags with the full namespace in braces
for url in root.findall('{http://www.sitemaps.org/schemas/sitemap/0.9}url'):
loc = url.find('{http://www.sitemaps.org/schemas/sitemap/0.9}loc').text
print(loc)
这是因为您必须使用定义 XML 的命名空间来限定标记名称。有关如何使用名称空间find和findall方法的详细信息来自Parse XML namespace with Element Tree findall
TA贡献1803条经验 获得超3个赞
如果你不想弄乱命名空间,这是比公认的答案更简单的解决方案,而且更优雅,使用通用的 xpath 查询:
import lxml.etree
tree = lxml.etree.parse('test.xml')
for url in tree.xpath("//*[local-name()='loc']/text()"):
print(url)
如果你更喜欢使用 xml 命名空间,你应该这样做:
import lxml.etree
tree = lxml.etree.parse('test.xml')
namespaces = {
'sitemapindex': 'http://www.sitemaps.org/schemas/sitemap/0.9',
}
for url in tree.xpath("//sitemapindex:loc/text()", namespaces=namespaces):
print(url)
如果你更喜欢直接从内存而不是文件加载 xml 数据,你可以使用 lxml.etree.fromstring 而不是 lxml.etree.parse。
添加回答
举报