Ruby on rails - 如何获得一个完整的URL,给定一个缩短的URL传递给Nokogiri



我想用Nokogiri遍历一些HTML文档。获取 XML 对象后,我希望将 Nokogiri 使用的获取文档的最后一个 URL 作为我的 JSON 响应的一部分。

def url = "http://ow.ly/hh8ri"     
doc = Nokogiri::HTML(open(url)
...

Nokogiri 在内部将其重定向到 http://www.mp.rs.gov.br/imprensa/noticias/id30979.html,但我想访问它。

我想知道"doc"对象是否可以访问某些 URL 作为属性或其他内容。有人知道解决方法吗?

顺便说一下,我想要完整的URL,因为我正在遍历HTML以查找<img>标签,有些标签具有相对标签,例如:"/media/image/image.png",然后我使用以下方法调整一些:

URI.join(url, relative_link_url).to_s

图片网址应为:

http://www.mp.rs.gov.br/media/imprensa/2013/01/30979_260_260__trytr.jpg 

而不是:

http://ow.ly/hh8ri/media/imprensa/2013/01/30979_260_260__trytr.jpg

编辑:想法

class Scraper < Nokogiri::HTML::Document
  attr_accessor :url
  class << self
    def new(url)
        html = open(url, ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE)
        self.parse(html).tap do |d|
            url = URI.parse(url)
            response = Net::HTTP.new(url.host, url.port)
            head = response.start do |r|
              r.head url.path
            end 
            d.url = head['location']
        end
    end
  end
end

使用 Mechanize。网址将始终转换为绝对:

require 'mechanize'
agent = Mechanize.new
page = agent.get 'http://ow.ly/hh8ri'
page.images.map{|i| i.url.to_s}
#=> ["http://www.mp.rs.gov.br/images/imprensa/barra_area.gif", "http://www.mp.rs.gov.br/media/imprensa/2013/01/30979_260_260__trytr.jpg"]

因为你的例子使用的是OpenURI,所以这是要问的代码,而不是Nokogiri。Nokogiri不知道内容来自哪里。

OpenURI可以很容易地告诉你:

require 'open-uri'
starting_url = 'http://www.example.com'
final_uri = nil
puts "Starting URL: #{ starting_url }"
io = open(starting_url) { |io| final_uri = io.base_uri }
doc = io.read
puts "Final URL: #{ final_uri.to_s }"

哪些输出:

Starting URL: http://www.example.com
Final URL: http://www.iana.org/domains/example

base_uri记录在 OpenURI::Meta 模块中。

我最近遇到了完全相同的问题。我所做的是创建一个继承自 Nokogiri::HTML::Document 的类,然后重写 new 类方法来解析文档,然后使用访问器将 url 保存在实例变量中:

require 'nokogiri'
require 'open-uri'
class Webpage < Nokogiri::HTML::Document
  attr_accessor :url
  class << self
    def new(url)
      html = open(url)
      self.parse(html).tap do |d|
        d.url = url
      end
    end
  end
end

然后你可以创建一个新的Webpage,它将可以访问你使用Nokogiri::HTML::Document的所有正常方法:

w = Webpage.new("http://www.google.com")
w.url
#=> "http://www.google.com"
w.at_css('title')
#=> [#<Nokogiri::XML::Element:0x4952f78 name="title" children=[#<Nokogiri::XML::Text:0x4952cb2 "Google">]>]

如果你有一些从图像标记中获取的相对 url,则可以通过将 url 访问器的返回值传递给 URI.join 来使其成为绝对 url:

relative_link_url = "/media/image/image.png"
=> "/media/image/image.png"
URI.join(w.url, relative_link_url).to_s
=> "http://www.google.com/media/image/image.png"

希望有帮助。

附言这个问题的标题很有误导性。更类似于"访问Nokogiri HTML文档的URL"的内容会更清晰。

相关内容

  • 没有找到相关文章

最新更新