python - analizar xml que contiene el espacio de nombres predeterminado para obtener un valor de elemento usando lxml
elementtree default-namespace (1)
Este es un error común cuando se trata de XML con espacio de nombres predeterminado. Su XML tiene un espacio de nombres predeterminado, un espacio de nombres declarado sin prefijo, aquí:
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
Tenga en cuenta que no solo el elemento donde se declara el espacio de nombres predeterminado está en ese espacio de nombres, sino que todos los elementos descendientes heredan implícitamente el espacio de nombres predeterminado de antepasado, a menos que se especifique lo contrario (utilizando un prefijo de espacio de nombres explícito o un espacio de nombres predeterminado local que apunte a un uri de espacio de nombres diferente).
Eso significa que, en este caso, todos los elementos, incluido
loc
están en el espacio de nombres predeterminado.
Para seleccionar un elemento en el espacio de nombres, deberá definir el prefijo para la asignación del espacio de nombres y usar el prefijo correctamente en XPath:
from lxml import etree
str1 = ''''''<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>
http://www.example.org/sitemap_1.xml.gz
</loc>
<lastmod>2015-07-01</lastmod>
</sitemap>
</sitemapindex>''''''
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)
salida:
<loc xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
http://www.example.org/sitemap_1.xml.gz
</loc>
Tengo una cadena xml como esta
str1 = """<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<sitemap>
<loc>
http://www.example.org/sitemap_1.xml.gz
</loc>
<lastmod>2015-07-01</lastmod>
</sitemap>
</sitemapindex> """
Quiero extraer todas las URL presentes dentro del nodo
<loc>
es decir,
http://www.example.org/sitemap_1.xml.gz
Probé este código pero no decía
from lxml import etree
root = etree.fromstring(str1)
urls = root.xpath("//loc/text()")
print urls
[]
Traté de verificar si mi nodo raíz está formado correctamente. Intenté esto y obtuve la misma cadena que str1
etree.tostring(root)
''<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">/n<sitemap>/n<loc>http://www.example.org/sitemap_1.xml.gz</loc>/n<lastmod>2015-07-01</lastmod>/n</sitemap>/n</sitemapindex>''