2016-03-25 15 views
2

arbeitet Ich bin neu in scrappy und ich spielte mit dem scrapy Shell versucht, diese Website zu crawlen: www.spiegel.de/sitemap.xmlscrapy response.xpath auf XML-Dokument mit Standard-Namespace leeren Array zurückgibt, während response.re

Ich habe es mit

scrapy shell "http://www.spiegel.de/sitemap.xml" 

und es funktioniert alles in Ordnung, wenn ich

verwenden
response.body 

i die gesamte Seite einschließlich xML-Tags sehen

jedoch zum Beispiel dieses:

response.xpath('//loc') 

einfach nicht funktionieren.

Das Ergebnis erhalte ich eine leere Array

während

response.selector.re('somevalidregexpexpression') 

eine Idee funktionieren würde, was könnte der Grund sein? könnte mit Codierung oder so verwandt sein? die Seite ist nicht utf-8

Ich benutze Python 2.7 auf Win 7. Ich versuchte die Xpath() auf einer anderen Website (Dmoz) und es hat gut funktioniert.

Antwort

6

Das Problem war aufgrund der Standard-Namespace am Stammelement des XML erklärt:

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

Also in diesem XML, das Root-Element und seine Nachkommen ohne Präfix den gleichen Namensraum erbt, implizit.

Auf der anderen Seite, in XPath müssen Sie Präfix verwenden, das an einen Namespace-URI gebunden ist, um Referenzelement in diesem Namespace, es gibt keinen solchen default Namespace impliziert.

können Sie selector.register_namespace() verwenden einen Namespacepräfix zum Standard-Namespace-URI, zu binden und dann das Präfix in Ihrem XPath verwenden:

response.selector.register_namespace('d', 'http://www.sitemaps.org/schemas/sitemap/0.9') 
response.xpath('//d:loc') 
+0

Das funktionierte perfekt. Vielen Dank! – elMeroMero