0

私はルビーを学ぼうとしているので、グーグル開発の練習を続けています。いくつかのリンクを解析しようとしています。リダイレクトが成功した場合(一度だけリダイレクトされる可能性があることを私は知っていることを考えると)、リダイレクトは禁止されます。httpプロトコルリンクからhttpsプロトコルリンクに移行していることに気づきました。グーグルの練習はPython用なので、ルビーでこれをどのように実装できるか具体的なアイデアはありますか?

エラー:

ruby fix.rb
redirection forbidden: http://code.google.com/edu/languages/google-python-class/images/puzzle/p-bija-baei.jpg -> https://developers.google.com/edu/python/images/puzzle/p-bija-baei.jpg?csw=1

私が探しているものを達成するはずのコード:

def acquireData(urls, imgs) #List item urls list of valid urls !checked, imgs list of the imgs I'll download afterwards.
  begin
    urls.each do |url|
      page = Nokogiri::HTML(open(url))
      puts page.body
    end
  rescue Exception => e
    puts e
  end
end
4

2 に答える 2

1

Ruby のOpenURIは、リダイレクトが HTML 自体の内部で発生する「メタリフレッシュ」でない限り、リダイレクトを自動的に処理します。

たとえば、これは自動的にリダイレクトに従います。

irb(main):008:0> page = open('http://www.example.org')
#<StringIO:0x00000002ae2de0>
irb(main):009:0> page.base_uri.to_s
"http://www.iana.org/domains/example"

つまり、「www.example.org」へのリクエストは「www.iana.org」にリダイレクトされ、OpenURI はそれを正しく追跡しました。

リダイレクトを処理する方法を知りたい場合は、Net::HTTPのドキュメントを読んでください。ドキュメントからそれを行う方法の例を次に示します。

次のリダイレクト

各 Net::HTTPResponse オブジェクトは、応答コードのクラスに属しています。

たとえば、すべての 2XX 応答は Net::HTTPSuccess サブクラスのインスタンスであり、3XX 応答は Net::HTTPRedirection サブクラスのインスタンスであり、200 応答は Net::HTTPOK クラスのインスタンスです。応答クラスの詳細については、以下のセクション「HTTP 応答クラス」を参照してください。

case ステートメントを使用すると、さまざまなタイプの応答を適切に処理できます。

デフ フェッチ (uri_str、制限 = 10)
  # より良い例外を選択する必要があります。
  制限 == 0 の場合、ArgumentError、「HTTP リダイレクトが多すぎます」を発生させます

  応答 = Net::HTTP.get_response(URI(uri_str))

  ケースレスポンス
  Net::HTTPSuccess の場合
    応答
  Net::HTTPRedirection の場合
    場所 = 応答['場所']
    「#{location} にリダイレクトされました」と警告する
    fetch(場所、制限 - 1)
  そうしないと
    応答値
  終わり
終わり

print fetch('http://www.ruby-lang.org')

メタリフレッシュ ステートメントを処理する場合は、次のことを考慮してください。

require 'nokogiri'

doc = Nokogiri::HTML(%[<meta http-equiv="refresh" content="5;URL='http://example.com/'">])
meta_refresh = doc.at('meta[http-equiv="refresh"]')
if meta_refresh
  puts meta_refresh['content'][/URL=(.+)/, 1].gsub(/['"]/, '')
end

どの出力:

http://example.com/
于 2013-02-27T18:55:04.357 に答える
0

基本的に、開こうとしている code.google の URL は https URL にリダイレクトされます。http://code.google.com/edu/languages/google-python-class/images/puzzle/p-bija-baei.jpgブラウザに貼り付ければ、自分で見ることができます

open-uri が https にリダイレクトできない理由を説明している次のバグ レポートを確認してください。

したがって、問題の解決策は簡単です。別の一連の URL を使用する (https にリダイレクトしない)

于 2013-02-27T19:00:13.437 に答える