如何获取 HTML 页面的当前 URL

How to get the current URL for a HTML page

我正在使用 Nokogiri 抓取一个网站。这个特定网站以不同方式处理绝对 URLs。

如果我给它 URL 喜欢:

page = Nokogiri::HTML(open(link, :allow_redirections => :all))

它将重定向到 HTTPS 版本,并且还会重定向到 URL 的长版本。例如,一个 link 喜欢

http://www.website.com/name

变成

http://www.website.com/other-area/name

这很好,并没有真正影响我的抓取器,但是,在某些边缘情况下,如果我可以告诉我的抓取器当前 URL 是什么,我可以避免它们。

在我将上面的 link 传递给我的 page 变量后,如何在重定向发生后获取该页面的当前 URL?

我假设您正在使用 open_uri_redirections gem 因为 :allow_redirections 在 Ruby 2.4+ 中不是必需的。

保存 OpenURI 的结果 open:

require 'open-uri'
r = open('http://www.google.com/gmail')
r.base_uri
# #<URI::HTTPS https://accounts.google.com/ServiceLogin?service=mail&passive=true&rm=false&continue=https://mail.google.com/mail/&ss=1&scc=1&ltmpl=default&ltmplcache=2&emr=1&osid=1#>
page = Nokogiri::HTML(r)

使用Mechanize,那么你可以:

agent = Mechanize.new
page = agent.get url
puts page.uri # this will be the redirected url