2

我一直在使用 Ruby 和 Nokogiri 从类似于 hollister 网站的 URL 中提取数据:http: //www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail? storeId=10251&catalogId=10201&langId=-1&URL =TrackDetailView&订单号=1316358

我的脚本现在看起来像这样:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

page = Nokogiri::HTML(open("http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358")) 

puts page.css("h3[data-property=GLB_ORDERNUMBERSYMBOL]")[0].text

我的问题是 Hollister 页面有某种异步加载数据,因此当我的脚本检查页面区域以及页面元素的订单特定数据时,它还不存在。IE,<h3>withdata-property=GBL_ORDERNUMBERSYMBOL还不存在,但在浏览器中,如果你让它再加载十秒钟,DOM 和 HTML 会发生变化以反映特定的订单详细信息。

捕获事后加载的数据的最佳方法是什么?我曾尝试使用 watir-webdriver,但也不确定我需要做什么才能使其正常工作。

4

3 回答 3

5

尝试安装Capybara-webkit(确保已安装 QtWebKit,否则 gem 安装将失败)。这将为您提供无头解决方案。然后试试这个:

require 'capybara-webkit'
require 'capybara/dsl'
require 'nokogiri'
require 'open-uri'

url = 'http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358'
#change the capybara config to DSL and to use webkit
include Capybara::DSL
Capybara.current_driver = :webkit
visit(url)
doc = Nokogiri::HTML.parse(body)

然后像往常一样解析身体。要删除所有错误消息,请尝试以下操作:

Capybara.register_driver :webkit do |app|
  Capybara::Driver::Webkit.new(app, :stdout => nil)
end
于 2012-07-23T00:12:37.757 回答
4

我不知道如何用 Open-URI 来做,但如果你想使用 Watir-Webdriver,下面的工作。

require 'watir-webdriver'
b = Watir::Browser.new
b.goto('http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=1316358')
puts b.h3(:class, 'order-num').when_present.text

注意 awhen_present()是在 h3 标签上执行的。这意味着脚本将等待 h3 出现,然后再尝试获取其文本。如果您知道有些部分需要时间来加载,那么添加显式等待通常可以解决问题。

于 2012-07-17T15:46:31.487 回答
0

在@benaneesh 的回答之后,我必须稍作修改才能让它在我的 ruby​​ 脚本中工作,并且不显示未知的 url 消息......

require 'capybara-webkit'
require 'capybara/dsl'
require 'nokogiri'
require 'open-uri'

include Capybara::DSL
Capybara.current_driver = :webkit

Capybara::Webkit.configure do |config|
  config.block_unknown_urls
  config.allow_url("*mysite.com")
end

#... rest of code
于 2016-01-17T18:23:51.510 回答