【问题标题】:process all links but external ones (ruby + mechanize)处理除外部链接以外的所有链接(ruby + mechanize)
【发布时间】:2010-04-27 03:36:09
【问题描述】:

我想处理整个网站的除外部链接之外的所有链接。有什么简单的方法可以识别链接是外部链接并跳过它吗?

我的代码看起来很像(站点 url 是通过命令行参数传递的)

我正在使用 mechanize (0.9.3) 和 ruby 1.8.6 (2008-08-11 patchlevel 287) [i386-mswin32]

请注意,网站可以使用相对路径,因此没有主机/域,这使得它有点复杂

require 'mechanize'

def process_page(page) 
  puts
  puts page.title
  STDIN.gets
  page.links.each do |link|
process_page($agent.get(link.href))
  end
end

$agent = WWW::Mechanize.new 
$agent.user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.4) Gecko/20091016 Firefox/3.5.4'
process_page($agent.get(ARGV[0]))

【问题讨论】:

    标签: ruby mechanize


    【解决方案1】:

    URI 有一些方法可以很容易地查看您是在查看本地 URL 还是其他站点上的 URL。

    这是对 URI .route_to() 文档示例的小修改:

    需要'uri' URI.parse('/main.rbx?page=1').host # => nil URI.parse('main.rbx?page=1').host # => nil

    内部 URL 没有主机,所以我会解析有问题的 URL 并查看它们是否有主机。如果不是,它是网站内部的。

    指向外部站点的 URL 将为主机返回一个值,但相关站点的完整 URL 也会返回一个值,因此您必须做更多的按摩。

    uri = URI.parse('http://my.example.com') uri.route_to('http://my.example.com/main.rbx?page=1').host # => nil uri.route_to('http://another.com/main.rbx?page=1').host # => "another.com"

    如果它有主机,请查看该主机是否与您的起始 URL 的主机匹配。您可以通过子字符串搜索或正则表达式匹配来做到这一点,但如果发生子字符串匹配,这两种方法都有可能返回误报。

    相反,我会使用 URI 的方法来避免那些误报;使用 route_to() 尝试构建 URL 的相对路径。如果结果有一个 .host 值,那么它是外部的。

    【讨论】:

    • 谢谢。这是因为我曾多次以我认为可行的方式撞到墙上,但没有。不能保证这将涵盖所有情况,但使用 URI 有助于消除许多意想不到的问题。 :-)
    【解决方案2】:

    使用链接的uri方法:

      page.links.each do |link|
         next unless link.uri.host.match(/(www\.)?thissite\.com/)
         process_page($agent.get(link.href))
      end
    

    【讨论】:

    • @COdeJoust:看起来不错但是in process_page':未定义的方法url' for #<WWW::Mechanize::Page::Link "" "Statement.html"> (NoMethodError)
    • 好的,看起来该方法实际上是 .uri 但有时您可以在 Web 服务器中拥有相对路径,然后我得到 undefined method 'match' for nil:NilClass (NoMethodError) 因为没有主机
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 2015-12-31
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多