Имам 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>