我正在关注使用Ruby和Watir进行屏幕抓取的this tutorial。
我尝试编写一个简单的脚本来从维基百科返回文本:
require "selenium-webdriver"
browser = Selenium::WebDriver.for :chrome
browser.get "https://wikipedia.org"
require "nokogiri"
puts doc.xpath(".//*[@id='langsearch-input']/p").inner_text
但是当我运行脚本时,我的终端出现了这个错误:
$ ruby app/views/layouts/scraper.rb
app/views/layouts/scraper.rb:7:in `<main>': undefined local variable or method `doc' for main:Object (NameError)
我有nokogiri 1.6.7.2,watir-webdriver 0.9.1和watir 4.0.2已安装。
我做错了什么?
答案 0 :(得分:1)
您缺少一行将浏览器HTML转换为Nokogiri文档。换句话说,您尚未定义doc
是什么。
require "selenium-webdriver"
browser = Selenium::WebDriver.for :chrome
browser.get "https://wikipedia.org"
require "nokogiri"
doc = Nokogiri::HTML.parse(browser.page_source)
puts doc.xpath(".//*[@id='langsearch-input']/p").inner_text
#=> ""
请注意,虽然这将解决异常,但inner_text
将返回一个空字符串 - 即""
。具有id&#34; langsearch-input&#34;的元素是一个输入字段,它没有子p
元素或文本节点。
另请注意,您实际上根本没有使用Watir。要使用Watir,它看起来像:
require 'watir-webdriver'
browser = Watir::Browser.new :chrome
browser.goto "https://wikipedia.org"
require 'nokogiri'
doc = Nokogiri::HTML.parse(browser.html)
puts doc.xpath(".//*[@id='langsearch-input']/p").inner_text
#=> ""
但是,除非您正在对单个大型HTML块进行大量解析,否则使用Watir而不使用Nokogiri可能会更容易:
require 'watir-webdriver'
browser = Watir::Browser.new :chrome
browser.goto "https://wikipedia.org"
puts browser.text_field(id: 'langsearch-input').value