Python xpath funktioniert nicht?

Okay, das fängt an, mich ein bisschen verrückt zu machen. Ich habe mehrere xml / xpath Bibliotheken für Python versucht und kann nicht herausfinden, eine einfache Möglichkeit, ein stinkin '"title" Element zu bekommen.

Der letzte Versuch sieht so aus (mit Amara):

def view(req, url): req.content_type = 'text/plain' doc = amara.parse(urlopen(url)) for node in doc.xml_xpath('//title'): req.write(str(node)+'\n') 

Aber das druckt nichts aus. Mein XML sieht so aus: http://programanddesign.com/feed/atom/

Wenn ich versuche //* anstelle von //title es alles wie erwartet zurück. Ich weiß, dass die XML- title dort ist, also was ist das Problem? Ist es der Namespace oder so? Wenn ja, wie kann ich es beheben?


Kann es nicht scheinen, dass es ohne Präfix funktioniert, aber das funktioniert:

 def view(req, url): req.content_type = 'text/plain' doc = amara.parse(url, prefixes={'atom': 'http://www.w3.org/2005/Atom'}) req.write(str(doc.xml_xpath('//atom:title'))) 

2 Solutions collect form web for “Python xpath funktioniert nicht?”

Sie müssen wohl nur den Namespace des Dokuments berücksichtigen, mit dem Sie zu tun haben.

Ich würde vorschlagen, wie man mit Namensräumen in Amara umgehen kann:

http://www.xml3k.org/Amara/Manual#namespaces

Bearbeiten: Mit dem Code-Snippet habe ich einige Änderungen vorgenommen. Ich weiß nicht, welche Version von Amara du benutzt hast, aber auf der Grundlage der docs habe ich versucht, es so viel wie möglich unterzubringen:

 def view(req, url): req.content_type = 'text/plain' ns = {u'f' : u'http://www.w3.org/2005/Atom', u't' : u'http://purl.org/syndication/thread/1.0'} doc = amara.parse(urlopen(url), prefixes=ns) req.write(str(doc.xml_xpath(u'f:title'))) 

Es sind ja die Namensräume. Es war ein bisschen schwierig, in den lxml docs zu finden, aber hier ist, wie du es machst:

 from lxml import etree doc = etree.parse(open('index.html')) doc.xpath('//default:title', namespaces={'default':'http://www.w3.org/2005/Atom'}) 

Sie können dies auch tun:

 title_finder = etree.ETXPath('//{http://www.w3.org/2005/Atom}title') title_finder(doc) 

Und du bekommst die Titel in beiden Fällen zurück.

  • Parsing xml von python lxml tree.xpath
  • Einen bestimmten Attributwert mit XPath erhalten
  • Entfernen von Leerzeichen und nicht bedruckbarem Zeichen in Python
  • Wie bekomme ich den kompletten Inhalt eines Knotens mit xpath & lxml?
  • Scrapy xpath selecter wiederholt Daten
  • Wie kann ich HTML mit html5lib analysieren und das geparste HTML mit XPath abfragen?
  • Wie selektiere ich Elemente in einem iframe mit Xpath?
  • Extrahieren Sie Informationen von der Website mit Xpath, Python
  • Lxml findall SyntaxError: ungültiges Prädikat
  • Wenn Attribut vorhanden ist, drucken Sie Kinder Beschreibung
  • Python-Skript, um alle Kommentare aus XML-Datei zu entfernen
  • Python ist die beste Programmiersprache der Welt.