2016-07-05 20 views
0

Ich habe eine XML-Datei wie untenWie XPath in lxml Python-Modul verwenden

<?xml version="1.0" encoding="UTF-8"?> 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
<url> 
    <loc>https://ezinearticles.com/</loc> 
    <changefreq>hourly</changefreq> 
    <priority>1.0</priority> 
</url> 
<url> 
    <loc>https://ezinearticles.com/submit/</loc> 
    <changefreq>weekly</changefreq> 
    <priority>0.3</priority> 
</url> 
................... 

Ich möchte lxml Modul verwenden xpathin URL von allen Tag zu bekommen. Ich habe es wie unten beschrieben implementiert, aber es hat nicht funktioniert. Das Ergebnis ist eine leere Liste

from lxml import etree 
parser = etree.XMLParser(ns_clean=True) 
xmlfile = "sitemap1.xml" 
xmlobj = etree.parse(xmlfile, parser) 

loc = xmlobj.xpath('//loc[text()]') 

print(loc) 

Kann mir jemand helfen, mein Skript zu reparieren?

+0

... gewährt, diese Frage betrifft nicht XHTML, aber es ist genau das gleiche Problem (nur mit zwei verschiedenen Namespaces). –

Antwort

1
# define a namespace map 
nsmap={'s': 'http://www.sitemaps.org/schemas/sitemap/0.9'} 

# use it in your query 
loc = xmlobj.xpath('//s:loc[text()]', namespaces=nsmap) 

In Ihrem ursprünglichen Code, suchen Sie nach einem loc (im Standard-Namespace), aber das Element eines tatsächlich {http://www.sitemaps.org/schemas/sitemap/0.9}loc (weil die xmlns= bedeutet, dass alles darunter verwendet, dass Namespace standardmäßig), das Warum stimmt die ursprüngliche Abfrage nicht überein?

+0

Versuchen Sie, Loc mit "Priorität = 1" durch den Code: loc = xmlobj.xpath ('// s: url [Priorität = 1]/loc/text()', Namespaces = Nsmap), aber leere Zeichenfolge, do du weißt, warum ? –

+0

'// s: url [s: Priorität = 1]/s: loc/text()', vorausgesetzt, dass alles außer den Namespaces richtig ist. –