python scrapy xpath抓取内容为空

目的是是打算抓取未来40天的天气预报的最高最低温度,要抓取的目标内容如图:

图片描述

尝试的代码为:item['temp_H']=response.xpath("//div[@class='city_40']/div[@class='W_left']/table/tbody/tr/td/div[@class='w_xian']/p/span[@class='max']")

但是返回的结果始终为空

用scrapy shell 了原始网页

图片描述

发现就没有预期应该出现的33°和25°出现,新手可能有些东西没说清楚,但是真诚的求指导!

阅读 14.5k
5 个回答

1.
首先禁用javascript然后查看你要的信息是否还在。

clipboard.png

可以看到,信息并不是在html页面里面的。

  1. 在NetWork tab里选择XHR来查看
    reload好像并没有发现什么。
  2. 我一般是在会更新的节点上下断点,比如 subtree modified.然后reload就会进入调试,在 call stack里面向上查看调用栈,找到ajax。
    比如我发现了在

clipboard.png
里面有 success函数,进入后发现了一个请求,url为"http://d1.weather.com.cn/calendar_new/2017/101300501_201709.html",数据类型为script,那么此时便可以在network选项卡中查看js filter里面的这个请求。

clipboard.png

  • 请提供抓取的url

  • chrome有个快捷方法获取xpath(在你需要抓取的地方,点击右键,可以直接Copy Xpath)

  • 没有出现温度信息,可能由于此信息为动态加载,你可以查看page_source,看看这里面是否有这个信息,来大致判断是否为动态加载数据

首先确认页面不是动态加载的

其次 如果提取属性 最后一个是/@属性 如果提取文本 最后是/text()
是不是缺了这个 chrome提取xpath经常是复杂且残缺的

新手上路,请多包涵

你可以尝试删除tbody,应该是可以的

  1. chrome的elements栏显示的是浏览器渲染后的页面代码,和你实际从url抓到的代码不是一个概念。如果你发现抓下来的文本里没有你要的温度,那多半是通过另外请求再加上的,从network里找。
  2. 写xpath我觉得没必要一层一层的把tag加上去,用好//符号即可。如果你发现你的规则不起作用,先去掉一部分调试,成功了再逐步加上。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题