如何使用Ruby爬取rubygems.org页面中input输入框的value属性值
问题原因
你代码的核心问题是误用了.text方法获取元素属性:input输入框的value值属于元素的自有属性,不是标签包裹的内部文本,因此直接调用.text只会返回空值。
修复方案
有两种常用的写法可以正确获取到value属性值:
方案1:Xpath直接提取属性节点
在xpath路径末尾加上/@value指定提取value属性,再调用.text拿到属性内容:
require "httparty" require "nokogiri" req = HTTParty.get("https://rubygems.org/gems/nokogiri") parse = Nokogiri::HTML(req.body) # 注意xpath末尾加/@value定位属性节点 val = parse.xpath("//*[@id='install_text']/@value").text puts val # 输出 gem install nokogiri
方案2:先定位元素再调用属性获取方法
用更简洁的CSS选择器定位到input元素后,调用Nokogiri的attr方法直接读取value属性,可读性更高:
require "httparty" require "nokogiri" req = HTTParty.get("https://rubygems.org/gems/nokogiri") parse = Nokogiri::HTML(req.body) # at_css直接匹配单个id为install_text的元素 val = parse.at_css("#install_text").attr("value") puts val # 输出 gem install nokogiri
补充说明
如果需要爬取不同gem的安装命令,只需要把请求URL中的nokogiri替换为对应gem的名称即可,也可以额外增加HTTP请求状态码判断逻辑,处理网络请求失败的异常场景。
内容的提问来源于stack exchange,提问作者sourav das
相关产品推荐
相关产品推荐

