处理具有默认命名空间的XML时,这是一个常见错误.您的XML具有默认名称空间,即没有前缀声明的名称空间,此处:
请注意,除非另有说明,否则不仅声明默认名称空间声明的元素在该名称空间中,而且所有后代元素都会隐式继承祖先默认名称空间(使用显式名称空间前缀或指向不同名称空间uri的本地默认名称空间).这意味着,在这种情况下,包括loc的所有元素都在默认命名空间中.
要在命名空间中选择元素,您需要为命名空间映射定义前缀并在XPath中正确使用前缀:
from lxml import etree
str1 = '''
http://www.example.org/sitemap_1.xml.gz
2015-07-01
'''
root = etree.fromstring(str1)
ns = {"d" : "http://www.sitemaps.org/schemas/sitemap/0.9"}
url = root.xpath("//d:loc", namespaces=ns)[0]
print etree.tostring(url)
输出:
http://www.example.org/sitemap_1.xml.gz