2

ユーザーが入力したURLが実際に有効なページであるかどうかを確認したいと思います。

私は試した:

if Nokogiri::HTML(open("http://example.com"))
  #DO REQUIRED TASK
end

ただし、ページを開こうとするとすぐにエラーが発生します。なんらかの文書かどうかの結果を返したい。

エラーが発生します:

no such file or directory

また:

getaddrinfo: Name or service not known

チェックの仕方にもよりますが。

4

3 に答える 3

4

私は次のようなものから始めます:

require 'nokogiri'
require 'open-uri'

begin
  doc = Nokogiri.HTML(open(url))
rescue Exception => e
  puts "Couldn't read \"#{ url }\": #{ e }"
  exit
end

puts (doc.errors.empty?) ? "No problems found" : doc.errors

Nokogiriは、ドキュメントのerrors配列を、解析プロセス中に発生したエラーの値に設定します。

ただし、これは問題の一部にしか対処していません。悪意のある人々は物事を壊すのが好きです、そしてこれは非常に簡単に壊れるでしょう。一般に、特にサイトが野生のインターネットにさらされている場合は、ユーザーから提供されるものには十分注意してください。

OpenURIにファイルをロードしてNokogiriに渡すように指示する前に、そのURLをスニッフィングし、HTTP HEADリクエストを使用して健全性チェックを実行して、取得するコンテンツのサイズとMIMEタイプを確認する必要があります。それらを知ったら、ファイルをロードしてみることができます。

于 2013-01-15T01:11:00.027 に答える
3

まず、Rubyで'rescue Exception=>e'を実行するのは悪いスタイルです。[参照:http ://daniel.fone.net.nz/blog/2013/05/28/why-you-should-never-rescue-exception-in-ruby/ ]

次に、この場合、「rescue OpenURI :: HTTPError=>e」の方が適しています。

于 2016-03-05T02:30:26.453 に答える
1

私は例外の処理に精通していませんが、次のようなものです。

begin
  page = Nokogiri::HTML(open("http://example.com"))
ensure
  puts "not a document of any kind"
end
do_something_whith(page) if page

...トリックを行う必要があります。

または(コメントを読んだ後):

begin
  page = open("http://example.com")
ensure
  puts "not a document of any kind"
end
Nokogiri::HTML(page) if page
于 2013-01-14T21:24:27.867 に答える