/ / parsing xml zawierający domyślną przestrzeń nazw, aby uzyskać wartość elementu za pomocą lxml - python, xml, lxml, elementtree, default-namespace

parsowanie xml zawierającego domyślną przestrzeń nazw, aby uzyskać wartość elementu za pomocą lxml - python, xml, lxml, elementtree, default-namespace

Mam taki ciąg znaków 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> """

Chcę wyodrębnić wszystkie obecne adresy URL <loc> węzeł to znaczy http://www.example.org/sitemap_1.xml.gz

Spróbowałem tego kodu, ale to nie słowo

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

Próbowałem sprawdzić, czy mój węzeł główny jest poprawnie utworzony. Próbowałem tego i odzyskał ten sam ciąg znaków co 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>"

Odpowiedzi:

7 dla odpowiedzi № 1

Jest to częsty błąd podczas pracy z XML mającym domyślną przestrzeń nazw. Twój XML ma domyślną przestrzeń nazw, zadeklarowaną przestrzeń bez prefiksu, tutaj:

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

Zauważ, że nie tylko element jest domyślnyzadeklarowana przestrzeń nazw znajduje się w tej przestrzeni nazw, ale wszystkie elementy potomne dziedziczą domyślnie domyślną przestrzeń nazw przodka, chyba że określono inaczej (używając jawnego prefiksu przestrzeni nazw lub lokalnej domyślnej przestrzeni nazw, która wskazuje na różne uri przestrzeni nazw). Oznacza to w tym przypadku wszystkie elementy, w tym loc są w domyślnej przestrzeni nazw.

Aby wybrać element w przestrzeni nazw, będziesz musiał zdefiniować przedrostek do mapowania przestrzeni nazw i poprawnie używać prefiksu w 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)

wyjście:

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