我需要从文本文件中读取一系列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>