我在使用以下代码使用 nokogiri 获取数据时遇到问题:
def run
# load HTML content to doc
doc = Nokogiri::HTML(open(@link))
cells = doc.css('div#z_full_column > div.content')
puts cells # just to see what i've got while running code
end
从本网站:
http://www.staples.com/sbd/cre/marketing/back-to-school/back-to-school-deals/weekly-deals.html
所有数据都消失了。我只看到<div class="content"></div>
.我试图在每个代码中放入sleep 5
,但它没有用。也许这里的问题是由jquery引起的。
问题是我假设来自 OpenURI 类的行:
open(@link)
不幸的是,OpenURI不支持JavaScript。这意味着通过jQuery加载的页面上的任何内容都不会被OpenURI看到。这意味着JavaScript/jQuery加载的内容不会被传递给Nokogiri。
我建议切换到支持驱动真实浏览器的 gem,它将支持 JavaScript。一些受欢迎的宝石包括Watir,Selenium-Webdriver和Capybara。我更喜欢Watir,因为它的API直观。
您使用 Watir 的示例是:
require 'watir'
# Open a firefox browser
browser = Watir::Browser.new :firefox
# Go to the url
browser.goto 'http://www.staples.com/sbd/cre/marketing/back-to-school/back-to-school-deals/weekly-deals.html'
# Get the name of the displayed products
products = browser.div(:class => 'content').divs(:class => 'z_prod_mod')
puts products.collect{ |p| p.h3.text }
#=> Staples® 1-subject notebook, 8" x 10.5", wide rule, 70 sheets
#=> "RoseArt ® crayons, 24/pack
#=> etc
# Close the browser
browser.close
在浏览器中转到该 URL,然后使用 View>Source(或可比)查看浏览器中的 HTML,然后编辑>查找并键入 class="content"
,您将看到以下内容:
<div class="content"></div>
</div>
然后,如果您梳理页面上包含的所有 Javascript 脚本,您可能会找到一个向该<div>
添加一些内容的脚本。 Nokogiri 不知道 JavaScript 对原始 HTML 做了什么。