我一直在使用Ruby和引入nokogiri从类似这样一个从霍利斯特网站的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
我的问题是,霍利斯特页面有某种数据的异步加载,这样当我的脚本检查页面与页面元素为了特定数据的区域,它还不存在的。 IE浏览器中, <h3>
与data-property=GBL_ORDERNUMBERSYMBOL
还不存在,但在浏览器中,如果你让它加载另一个十秒钟,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
请注意, when_present()
是在H3标签进行。 这意味着,该脚本将等待H3在试图获取其文本前出现。 如果你知道有这需要时间来加载部分,添加一个明确的等待通常会解决此问题。
尝试安装水豚,WebKit的 (请确保您已经安装了QtWebKit的,否则创业板安装会失败)。 这会给你一个无头的解决方案。 那么试试这个:
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
继@ 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
文章来源: How do I scrape data from a page that loads specific data after the main page load?