2

私はRubyとNokogiriを使用して、ホリスターのWebサイトから次のような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ページにある種の非同期データの読み込みがあることです。たとえば、スクリプトがページ要素の順序固有のデータでページの領域をチェックするとき、それはまだ存在していません。IE、<h3>withdata-property=GBL_ORDERNUMBERSYMBOLはまだ存在しませんが、ブラウザでさらに10秒間ロードすると、特定の注文の詳細を反映するように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

when_present()aは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 に答える