我一直在使用ruby和nokogiri从hollister网站的类似url中提取数据:http://www.hollisterco.com/webapp/wcs/stores/servlet/TrackDetail?storeId=10251&catalogId=10201&langId=-1&URL=TrackDetailView&orderNumber=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页面有某种类型的异步数据加载,因此当我的脚本使用页面元素的特定于顺序的数据检查页面区域时,它还不存在。也就是说,带有<h3>data-property=GBL_ORDERNUMBERSYMBOL还不存在,但是在浏览器中,如果您让它再加载10秒,dom和html将更改以反映特定的订单详细信息。
捕获事后加载的数据的最佳方法是什么?我试过使用watir webdriver,但也不确定我需要做些什么才能让它工作。

最佳答案

我不知道如何使用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出现,然后再尝试获取其文本。如果知道有些部分需要时间加载,添加显式等待通常可以解决问题。

08-15 14:41
查看更多