python - scrapy response.xpath 在具有默认命名空间的 xml 文档上返回空数组,而 response.re 有效

标签 python xml xpath scrapy default-namespace

我是 scrapy 的新手,我正在玩 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 中,根元素及其不带前缀的后代继承相同的 namespace ,隐式

另一方面,在 XPath 中,您需要使用绑定(bind)到命名空间 URI 的前缀来引用该命名空间中的元素,没有暗示这样的默认命名空间

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

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

关于python - scrapy response.xpath 在具有默认命名空间的 xml 文档上返回空数组,而 response.re 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36229985/

相关文章:

python - 类型错误 : Arrays must have consistent types in assignment

xml - 在nifi中使用EvaluateXpath

java - 有意义的 XML 比较

python - 从外部函数访问 QLCDNumber 对象

python - 请求 - 如何流式上传 - 部分文件

python - 使用共享内存从单独的 C 进程访问 numpy 数组

xml - Inno Setup - XML 编辑 XPath 请求失败,错误代码为 "NIL Interface Exception at runtime"

android - 在线存储数据 ANDROID

php - 使用 XPath 和 PHP 解析 HTML

XSLT 选择没有 child 的文本