这个字段的src属性如何用xpath选择?

<img class="js-refreshCaptcha captcha" width="120" height="30" data-tip="s$t$看不清楚?换一张" alt="验证码" src="/captcha.gif?r=1462431202340&amp;type=login" style="display: block;">

这个字段的src属性如何用xpath选择?

我的写法是:

captcha_url = response.xpath('/html/body/div[1]/div/div[2]/div[2]/form/div[1]/div[3]/div/img/@src').extract()

中间的xpath是从chrome直接copy的
但是无法显示出src属性,最后弹出的是[]
不知道哪里有问题、
另外如果知道css选择器怎么写的,也可以告知一下,我看到class中有空格,不知道如何选择.
我的写法是:

captcha_url = response.css('.js-refreshCaptcha .captcha::attr(src)').extract()

从Scrapy命令行中一步步测试得到,是不是因为是JS动态生成的原因?才会导致@src属性无法获取?
Xpath

阅读 22.9k
6 个回答
新手上路,请多包涵

2020年了,我遇到了和楼主相似的问题。xpath返回img src为空,后来我尝试用python打印出整个html页面,发现打印出的html.txt中,img的URL实际上是写在了data-src属性中的,把scrapy中的@src改成@data-src后,就能返回正常的url了

你想干啥,抓取到的html进行过滤吗?可以考虑正则查找

chrome有个工具叫xpath-helper,可以去应用商店下载,这样就可以用这个工具来检查你的xpath语法是否正确了。
另外如果语法正确,但是在程序中提取不到,这时就要考虑原网页是动态页面,需要用到jsjs解析了。

浏览器有容错机制,对于不规范的html标签,会进行修正,所以你在控制台看到的页面结构,和你用代码请求到的页面结构可能是不一样的。
解决方案:
把选择器的范围放的松一点
使用class去定位
在代码中打断点,单步执行去定位这个标签的xpath规则

我一般使用bs4, 无脑解决. 用正则也行,但是伤脑

img_tag = soup.find('img', attrs=dict(class="js-refreshCaptcha captcha") )
img_tag_src = img_tag['src']
captchaUrl = ''.join(response.xpath("//img[@class='js-refreshCaptcha captcha']/@src").extract())
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题