15

我是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(),它运行良好。

4

2 回答 2

29

问题是由于在 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')
于 2016-03-26T00:44:58.267 回答
3

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

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

如果您正在解析来自多个异构源的响应并且您不想注册每个名称空间,这将特别有用。

于 2018-10-23T08:51:36.413 回答