2

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 にアクセスできるかどうかを知りたいです。誰かが回避策を知っていますか?

ところで、私は<img>タグを見つけるために HTML をトラバースしており、一部には "/media/image/image.png" のような相対タグが含まれているため、完全な URL が必要です。

URI.join(url, relative_link_url).to_s

画像の URL は次のとおりです。

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
4

3 に答える 3

3

機械化を使用します。URL は常に絶対に変換されます。

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"]
于 2013-01-31T05:02:24.267 に答える
2

あなたの例では 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_uriOpenURI::Metaモジュールに文書化されています。

于 2013-02-04T04:27:34.433 に答える
1

私は最近まったく同じ問題を抱えていました。私がしたことは、から継承するクラスを作成し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アクセサの戻り値を に渡すことで絶対 URL にすることができURI.joinます。

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"

それが役立つことを願っています。

ps この質問のタイトルはかなり誤解を招くものです。「のこぎり HTML 文書の URL にアクセスする」の行に沿った何かがより明確になります。

于 2013-01-31T03:47:08.630 に答える