/ / parsing xml, съдържащ пространство от имена по подразбиране, за да получи стойност на елемента, използвайки lxml - python, xml, lxml, elementtree, default-namespace

parsing xml, съдържащ имена на флота по подразбиране, за да получите стойност на елемент с помощта на lxml - python, xml, lxml, elementtree, default-namespace

Имам XML низ като този

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> """

Искам да извадя всички налични вътрешни адреси <loc> възел т.е. http://www.example.org/sitemap_1.xml.gz

Опитах този код, но той не каза

from lxml import etree
root = etree.fromstring(str1)
urls = root.xpath("//loc/text()")
print urls
[]

Опитах се да проверя дали кореновия ми възел е оформен правилно. Опитах това и се върна същия низ като 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>"

Отговори:

7 за отговор № 1

Това е често срещана грешка, когато се работи с XML със пространство от имена по подразбиране. Вашият XML има пространство от имена по подразбиране, пространство от имена, декларирано без префикс, тук:

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

Имайте предвид, че не само елемент, където по подразбиранедекларираното пространство за имена е в това пространство от имена, но всички елементи на наследниците наследяват по подразбиране пространството от имена по подразбиране, освен ако не е указано друго (използвайки префикс на изрично пространство от имена или локално пространство от имена по подразбиране, което сочи към различно име на пространство). Това означава, в този случай, всички елементи, включително loc са в пространството за имена по подразбиране.

За да изберете елемент в пространството от имена, ще трябва да дефинирате префикс към картографиране на пространството на имената и да използвате префикса правилно в 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)

изход:

<loc xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
http://www.example.org/sitemap_1.xml.gz
</loc>