【问题标题】:Ruby: Detecting broken links without actually crawling the URL?Ruby:在不实际抓取 URL 的情况下检测损坏的链接?
【发布时间】:2013-10-30 16:28:58
【问题描述】:

是否有 Ruby gem 或 Ruby-esque 方法来检查网页是否有损坏的链接,而无需抓取实际链接并检查 404 等。基本上,我想要一个离线工作的解决方案,我想检测链接显然在语法上被破坏了,而不是指向不存在的网页的链接。

例如,如果一个链接指向“http//stackoverflow.com”,那是一个语法损坏的链接,我想检测它。但是,如果链接指向“http://www.webpagedoesnotexistyet.com”并返回 404,我可以不检测到。

【问题讨论】:

  • 听起来你想使用正则表达式。我会看看这篇文章:stackoverflow.com/questions/4716513/…
  • 检测到/tags 或/users 等相对链接时应用什么逻辑?
  • 您仍将使用正则表达式,首先查找所有 a 标签,然后检查 href 以确保它是有效的完整 URL 或以 / 开头并且没有'在右引号之前不要包含任何无效字符。看到这个帖子:stackoverflow.com/questions/499345/…
  • Not a regex alone,而是一个 XML 解析器,用于检测 <a> 标签的 href 属性,然后通过正则表达式传递。
  • 当然还有this post的必填链接...

标签: ruby-on-rails ruby


【解决方案1】:

使用 nokogiri 解析 HTML 和 URI.parse 来检查有效的 URL。如果 URI 遇到它认为是无效的 url,它将引发错误。

【讨论】:

  • 不过,它会很高兴地吃掉“http//stackoverflow.com”。
【解决方案2】:

使用这个:下面的链接是一个链接数组

for link in links do
    begin
        url = URI.parse(link)
        req = Net::HTTP.new(url.host, url.port)
        res = req.request_head(url.path)

        if res.code == "200"
            puts "#{res.code} ok - #{link}"
        else
            puts "#{res.code} error - #{link}"
        end
    rescue
        puts "breaking for #{link}"
    end
end

【讨论】:

    【解决方案3】:

    您可以使用URI.regexp。如果一个字符串匹配它,它是一个有效的 uri。

    require 'uri'
    
    def valid_uri?(s)
      !!(s =~ URI.regexp)
    end
    
    
    valid_uri?('http//stackoverflow.com') # => false
    valid_uri?('http://www.webpagedoesnotexistyet.com/') # => true
    

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      相关资源
      最近更新 更多