【问题标题】:OpenURI having issues when passed URLs with fragment identifiersOpenURI 在传递带有片段标识符的 URL 时出现问题
【发布时间】:2016-06-15 20:24:47
【问题描述】:

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

【问题讨论】:

  • 您不应发送包含片段的请求。浏览器在发送请求之前会剥离这些内容。
  • 请阅读“minimal reproducible example”。当询问您的代码问题时,尤其是与输入数据有关的问题时,我们需要在问题本身中复制问题的最小数据示例。虽然我们经常可以拼凑出一些重现问题的东西,但这样做会浪费我们的时间,如果想象的数据不正确,可能会导致混乱或错误的答案。因此,我们需要您为我们提供它。它可以节省我们的时间并帮助我们帮助您,并帮助其他任何寻找类似解决方案的人确定您的问题是否符合他们的需求。
  • @ 铁皮人表示感谢。第一个问题,所以下一个问题会更好。干杯!

标签: ruby open-uri fragment-identifier


【解决方案1】:

问题

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

来自Wikipedia: Fragment Identifier

片段标识符的功能与 URI 的其余部分不同:也就是说,它的处理完全是客户端,没有 Web 服务器的参与——当然,服务器通常有助于确定 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"

【讨论】:

  • 使用 URI 或 Addressable::URI 来操作 URI 是个好主意。虽然我们经常可以在没有类的情况下对 URI 进行更改,但它们往往需要特殊的编码,而这些编码会被遗漏,但类会自动提供。删除a fragment 很简单,只需将nil 分配给它:uri.fragment = nil
【解决方案2】:

您已经完成了 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>

【讨论】:

  • 谢谢!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2012-06-13
  • 2015-07-26
  • 2011-06-25
相关资源
最近更新 更多