0

FedEx サイトを解析して追跡情報を取得する小さな Rails アプリケーションを作成しようとしています。Nokogiri を使用してサイトを解析しようとしましたが、サイトのコンテンツが Ajax 経由で読み込まれているようで、キャプチャできません。

これが私がテストしていたコードです:

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

doc = Nokogiri::HTML(open('https://www.fedex.com/fedextrack/?cntry_code=us&tab=1&tracknums=543433298736'))

doc.xpath('//*[(@id = "destinationDateTime")]').each do |status|
  puts status.content
end

これに関するヘルプは素晴らしいでしょう。

4

3 に答える 3

3

ページ全体を解析するのは悪い形式です。代わりに、FedEx API を利用するactive_shippingなどの配送/追跡ジェムを使用してください。FedEx パッケージの追跡に関するセクションもあります。

fedex = FedEx.new(:login => '999999999', :password => '7777777')
tracking_info = fedex.find_tracking_info('tracking-number', :carrier_code => 'fedex_ground') # Ground package

tracking_info.shipment_events.each do |event|
  puts "#{event.name} at #{event.location.city}, #{event.location.state} on #{event.time}. #{event.message}"
end
于 2013-01-22T20:05:10.583 に答える
1
require 'mechanize'
require 'json'

r = Mechanize.new
r.verify_mode = OpenSSL::SSL::VERIFY_NONE

def fedex(r,tracking_number)

    return r.get("https://www.fedex.com/trackingCal/track?data={%22TrackPackagesRequest%22%3A{%22appType%22%3A%22wtrk%22%2C%22uniqueKey%22%3A%22%22%2C%22processingParameters%22%3A{%22anonymousTransaction%22%3Atrue%2C%22clientId%22%3A%22WTRK%22%2C%22returnDetailedErrors%22%3Atrue%2C%22returnLocalizedDateTime%22%3Afalse}%2C%22trackingInfoList%22%3A[{%22trackNumberInfo%22%3A{%22trackingNumber%22%3A%22#{tracking_number}%22%2C%22trackingQualifier%22%3A%22%22%2C%22trackingCarrier%22%3A%22%22}}]}}&action=trackpackages&locale=en_US&format=json&version=99").body

end

puts "Package number 543433298736 is: " + JSON.parse(fedex(r,"543433298736"))["TrackPackagesResponse"]["packageList"][0]["keyStatus"]
# For the "estimated delivery datetime": ["TrackPackagesResponse"]["packageList"][0]["displayEstDeliveryDateTime"]

このコードで仕事は完了です:-)

于 2013-01-23T16:38:33.933 に答える
0

私は似たようなものを作りました..ポルターガイストを介してカピバラとファントムJSを使用することになりました... JavaScriptを非常にうまく処理します...

ここに私のスクリプトの一部があります:

# -*- encoding : utf-8 -*-

require 'rubygems'
require 'capybara'
require 'capybara/dsl'
require 'capybara/poltergeist'

class MyTest

    include Capybara::DSL

    Capybara.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new(app, {debug: false})
    end

    Capybara.run_server = false
    Capybara.current_driver = :poltergeist
    Capybara.app_host = 'http://www.example.com'

    def run
        visit('/home/bezirk?bezirk=1212')
        ...
    end
end
MyTest.new.run
于 2013-01-22T20:04:20.813 に答える