Ruby 当传递带有片段标识符的URL时,OpenURI出现问题

Ruby 当传递带有片段标识符的URL时,OpenURI出现问题,ruby,open-uri,fragment-identifier,Ruby,Open Uri,Fragment Identifier,我需要从文本文件中读取一系列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!(/\r\

我需要从文本文件中读取一系列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!(/\r\n?/, "\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
#要求
需要“nokogiri”
需要“打开uri”
#打开输入文本文件中的每一行
行数=0
text=File.open('input.txt')。读取
text.gsub!(/\r\n?/,“\n”)
text.u每行do |行|
打印“#{line_num+=1}{line}”
打开('output.txt','a'){f|
f、 放置“#{line_num}#{line}”
}
uri=uri.parse(uri.encode(line.strip))
page=Nokogiri::HTML(打开(uri))
links=page.css(“div.product-carousel-container a”)
#循环通过链接(如果存在)
e=0
而e
问题 URI的片段部分不应发送到服务器

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

解决方案 在将URI传递给
open
之前,先剥离URI的片段部分

require "uri"

u = URI.parse "http://example.com#fragment"
u.fragment = nil
u.to_s #=> "http://example.com"
问题 URI的片段部分不应发送到服务器

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

解决方案 在将URI传递给
open
之前,先剥离URI的片段部分

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>
需要“打开uri”
uri=uri.parse('http://foo.com/index.html#bar')
uri#=>#
uri.fragment=nil
uri#=>#

你已经完成了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>
需要“打开uri”
uri=uri.parse('http://foo.com/index.html#bar')
uri#=>#
uri.fragment=nil
uri#=>#

您不应该发送包含片段的请求。浏览器会在发送请求之前删除这些内容。请阅读“”。当询问代码的问题时,特别是涉及输入数据的问题时,我们需要在问题本身中复制问题的最小数据示例。虽然我们经常可以拼凑出一些重现问题的东西,但这样做会浪费我们的时间,如果想象的数据不正确,可能会导致混乱或错误的答案。所以,我们需要你为我们提供。“它节省了我们的时间,帮助我们帮助您,并帮助其他寻求类似解决方案的人决定您的问题是否符合他们的需要。”铁皮人表示感谢。第一个问题,所以下一个问题的措辞会更好。干杯您不应该发送包含片段的请求。浏览器会在发送请求之前删除这些内容。请阅读“”。当询问代码的问题时,特别是涉及输入数据的问题时,我们需要在问题本身中复制问题的最小数据示例。虽然我们经常可以拼凑出一些重现问题的东西,但这样做会浪费我们的时间,如果想象的数据不正确,可能会导致混乱或错误的答案。所以,我们需要你为我们提供。“它节省了我们的时间,帮助我们帮助您,并帮助其他寻求类似解决方案的人决定您的问题是否符合他们的需要。”铁皮人表示感谢。第一个问题,所以下一个问题的措辞会更好。干杯最好使用URI或Addressable::URI来操作URI。虽然我们通常可以在不使用类的情况下对URI进行更改,但它们往往需要特殊的编码,这种编码会被忽略,但类会自动提供。删除很容易,只需将
nil
分配给它:
uri.fragment=nil
。最好使用uri或Addressable::uri来操作uri。虽然我们通常可以在不使用类的情况下对URI进行更改,但它们往往需要特殊的编码,这种编码会被忽略,但类会自动提供。删除很容易,只需将
nil
分配给它:
uri.fragment=nil
。谢谢!非常感谢!非常感谢。非常感谢!