1

我在通过以下代码使用 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 引起的。

4

2 回答 2

1

在浏览器中转到该 URL,然后使用 View>Source(或类似的)查看浏览器中的 HTML,然后 Edit>Find 并输入class="content",您将看到:

<div class="content"></div>



</div>

然后,如果您梳理页面中包含的所有 Javascript 脚本,您可能会发现其中添加了一些内容<div>。Nokogiri 不知道 JavaScript 对原始 HTML 做了什么。

于 2013-09-10T04:33:56.880 回答
1

问题是这条线,我假设它来自 OpenURI 类:

open(@link)

不幸的是,OpenURI 不支持 JavaScript。这意味着通过 jQuery 加载的页面上的任何内容都不会被 OpenURI 看到。这意味着 JavaScript/jQuery 加载的内容不会传递给 Nokogiri。

我建议切换到支持驱动真正浏览器的 gem,它将支持 JavaScript。一些流行的 gem 包括 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
于 2013-09-10T13:15:49.033 回答