如何正确编写XPath?抓取站点地图时XPath选择器无返回求助
站点地图XPath查询无效问题解决方案
核心原因
你遇到的查询无返回问题是XML默认命名空间导致的。标准站点地图的根节点urlset自带http://www.sitemaps.org/schemas/sitemap/0.9的默认命名空间声明,你写的XPath没有指定命名空间,因此无法匹配到对应节点。
Chrome浏览器查看XML时会自动格式化、调整展示结构,和服务器返回的原始内容存在差异,调试时以Scrapy Shell获取的原始响应、火狐浏览器的源码展示内容为准即可。
可用解决方法
方法一:指定命名空间查询(推荐)
Scrapy的XPath支持传入命名空间参数,先为默认命名空间定义别名,再调整XPath语法即可:
# 定义站点地图命名空间别名 ns = {"sm": "http://www.sitemaps.org/schemas/sitemap/0.9"} # 携带命名空间查询对应节点 result = response.xpath('/sm:urlset/sm:url[1]/sm:loc').get()
该方法完全符合XML查询规范,稳定性最高。
方法二:忽略命名空间匹配
如果不想处理命名空间,也可以用local-name()函数直接匹配节点名称,绕过命名空间限制:
result = response.xpath('/*[local-name()="urlset"]/*[local-name()="url"][1]/*[local-name()="loc"]').get()
内容的提问来源于stack exchange,提问作者Konstantin Pliev
相关产品推荐
相关产品推荐

