Openuri通过碎片标识符通过URL时会出现问题



我需要从文本文件中读取一系列URL,然后检索页面并输出链接列表。

每当输入URL包含片段标识符(#)时,代码就会出现问题。我尝试使用%23逃脱这些,但这似乎没有帮助。

给出的错误来自Openuri,为404。

#requirements
require 'nokogiri'
require 'open-uri'
#opening each line in input text file
line_num=0
text=File.open('input.txt').read
text.gsub!(/rn?/, "n")
text.each_line do |line|
    print "#{line_num += 1} #{line}"
    open('output.txt', 'a') { |f|
        f.puts "#{line_num} #{line}"
    }
    uri = URI.parse(URI.encode(line.strip))
    page = Nokogiri::HTML(open(uri))   
    links = page.css("div.product-carousel-container a")
    #loop through links if present
    e = 0
    while e < links.length
        open('output.txt', 'a') { |f|
        f.puts links[e]["href"]
        }
        e += 1
    end  
end

问题

不应将URI的片段部分发送到服务器。

来自Wikipedia:片段标识符

片段标识符的功能与URI的其余部分不同:即,其处理仅是客户端的,而没有来自Web服务器的参与 - 当然,服务器通常有助于确定MIME类型,并且MIME类型确定了MIME类型碎片的处理。当代理(例如Web浏览器)从Web服务器请求Web资源时,代理将URI发送到服务器,但不会发送片段。相反,代理等待服务器发送资源,然后根据文档类型和片段值处理资源。

解决方案

将URI的片段片段传递给open

require "uri"
u = URI.parse "http://example.com#fragment"
u.fragment = nil
u.to_s #=> "http://example.com"

您在那里的90%。客户负责处理片段。

您的代码已经在使用URI来解析字符串,因此让解析的对象删除片段:

require 'open-uri'
uri = URI.parse('http://foo.com/index.html#bar')
uri # => #<URI::HTTP http://foo.com/index.html#bar>
uri.fragment = nil
uri # => #<URI::HTTP http://foo.com/index.html>

相关内容

  • 没有找到相关文章

最新更新