Watir with Ruby:未定义的局部变量或方法`doc' for main:对象

时间:2016-02-20 07:21:58

标签: ruby web-scraping screen-scraping watir watir-webdriver

我正在关注使用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已安装。

我做错了什么?

1 个答案:

答案 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