0

このコードに問題があります:

require 'rubygems'
require 'rdf'
require 'rdf/raptor'

RDF::Reader.open("http://reegle.info/countries/IN.rdf") do |reader|
  reader.each_statement do |statement|
    puts statement.inspect
  end
end

上記のURLを開こうとすると、URI.parseが明らかに気に入らないURLにリダイレクトされます。

http://sparql.reegle.info?query=CONSTRUCT+{+%3Chttp://reegle.info/countries/IN%3E+?p+?o.+%3Chttp://reegle.info/countries/IN.rdf%3E+foaf:primaryTopic+%3Chttp://reegle.info/countries/IN%3E;+cc:license+%3Chttp://www.nationalarchives.gov.uk/doc/open-government-licence%3E;+cc:attributionName+"REEEP";+cc:attributionURL+%3Chttp://reegle.info/countries/IN%3E.+}+WHERE+{+%3Chttp://reegle.info/countries/IN%3E+?p+?o.}&format=application/rdf%2Bxml

したがって、次のエラーが発生します。

URI::InvalidURIError: bad URI(is not URI?)

この問題を回避するためのアイデア、方法はありますか?

ありがとう

PS URI.parse(URI.encode([url])))のようなことをしても、ここでは何の効果もありません。

4

1 に答える 1

1

URIは、その URL の二重引用符や中括弧を好みません。次のようなものを使用して、URI を手動で修正できます。

# This auto-populating cache isn't necessary but...
replacements = Hash.new { |h,k| h[k] = URI.encode(k) }
broken_uri.gsub!(/[{}"]/) { replacements[$&] }

RFC 1738から: Uniform Resource Locators (URL) :

したがって、英数字、特殊文字 " $-_.+!*'(),"、および予約された目的で使用される予約文字のみが、URL 内でエンコードされずに使用できます。

したがって、reegle.info は実際よりも多くのものを URL エンコードする必要があると言えます。OTOH、Ruby の URI クラスはもう少し寛容になる可能性があります (たとえば、 Perl のURI クラスはその URI を入力として受け入れますが、出力時に二重引用符と中括弧をパーセント エンコード形式に変換します)。

于 2011-06-24T17:38:04.537 に答える