繁体   English   中英

scrapy response.xpath使用默认命名空间返回xml文档上的空数组,而response.re工作

[英]scrapy response.xpath returns empty array on xml document with default namespace, while response.re works

我是新手,我正在玩scrapy shell尝试抓取这个网站: www.spiegel.de/sitemap.xml

我做到了

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

当我使用时,它工作得很好

response.body 

我可以看到整个页面包括xml标签

但是例如:

response.xpath('//loc') 

根本不会工作。

我得到的结果是一个空数组

response.selector.re('somevalidregexpexpression') 

会工作

任何想法可能是什么原因? 可能与编码有关吗? 该网站不是utf-8

我在Win 7上使用python 2.7。我在另一个站点(dmoz)上尝试了xpath(),它工作正常。

问题是由于在XML的根元素处声明的默认名称空间

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

因此,在该XML中,根元素及其没有前缀的后代隐式地继承了相同的名称空间。

另一方面,在XPath中,您需要使用绑定到命名空间URI的前缀来引用该命名空间中的元素,并不存在隐含的此类默认命名空间

您可以使用selector.register_namespace()将名称空间前缀绑定到默认名称空间URI,然后在XPath中使用前缀:

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

您还可以将xpath与本地命名空间一起使用,例如:

response.xpath("//*[local-name()='loc']")

如果您正在解析来自多个异构源的响应并且您不想注册每个命名空间,则此功能尤其有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM