scrapy response.xpath returns xml 文档上的空数组,具有默认命名空间,而 response.re 有效
scrapy response.xpath returns empty array on xml document with default namespace, while response.re works
我是 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 中,根元素及其没有前缀的后代继承相同的命名空间,隐式。
另一方面,在 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']")
如果您要解析来自多个异构源的响应并且不想注册每个命名空间,这将特别有用。
我是 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 中,根元素及其没有前缀的后代继承相同的命名空间,隐式。
另一方面,在 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']")
如果您要解析来自多个异构源的响应并且不想注册每个命名空间,这将特别有用。