【问题标题】:How to extract URLs from text如何从文本中提取 URL
【发布时间】:2010-09-08 06:17:00
【问题描述】:

如何在 Ruby 中从纯文本文件中提取所有 URL?

我尝试了一些库,但在某些情况下它们会失败。最好的方法是什么?

【问题讨论】:

  • 您尝试过哪些库,它们以什么方式失败?
  • 当提出这样的问题时,我们希望看到您尝试解决问题。我们很乐意帮助修复您的代码,但要求我们为您编写代码是题外话。请阅读“How to Ask”和“minimal reproducible example”。

标签: ruby


【解决方案1】:

如果您喜欢使用 Ruby 中已经为您提供的内容:

require "uri"
URI.extract("text here http://foo.example.org/bla and here mailto:test@example.com and here also.")
# => ["http://foo.example.org/bla", "mailto:test@example.com"]

阅读更多:http://railsapi.com/doc/ruby-v1.8/classes/URI.html#M004495

【讨论】:

  • 它在带有“:”的文本上失败blog.apptamers.com/post/48613650042/…
  • URI.extract(yourString, /http(s)?|mailto/)
  • 有没有办法提取没有架构的url?比如 www.example.com
  • 欣赏标准的 lib 功能,非常适合大多数情况。值得注意的是,postrank-uri gem 也有一个类似的提取方法PostRank::URI.extract(text),它似乎可以处理更多的边缘情况。
【解决方案2】:

我用过twitter-text gem

require "twitter-text"
class UrlParser
    include Twitter::Extractor
end

urls = UrlParser.new.extract_urls("http://stackoverflow.com")
puts urls.inspect

【讨论】:

  • 对于较新的版本,您需要包含 Twitter::TwitterText::Extractor,而不是包含 Twitter::Extractor
【解决方案3】:

您可以使用正则表达式和.scan()

string.scan(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/)

您可以开始使用该正则表达式并根据您的需要进行调整。

【讨论】:

    【解决方案4】:

    哪些案例失败了?

    根据库regexpert,可以使用

    regexp = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix
    

    然后对文本执行scan

    编辑:似乎正则表达式支持空字符串。只需删除最初的(^$) 即可完成

    【讨论】:

    • 有趣的是,当 URL 是 IP 地址时,此正则表达式如何失败
    • 是的。实际上,我对您的回答投了赞成票,因为“并根据您的需要进行调整”。当出现 user@password 或使用 https? 以外的其他奇怪情况时,它也会失败。您可能不想阅读 tools.ietf.org/html/rfc3986 开始 -_-
    • 如上失败。我在这里问为什么我无法“根据您的需要进行调整”。
    • 使用其他答案中显示的内置 ruby​​ 方法似乎是一个更清洁的解决方案。这可能不应该被选为最佳答案。
    【解决方案5】:

    如果您的输入与此类似:

    "http://i.imgur.com/c31IkbM.gifv;http://i.imgur.com/c31IkbM.gifvhttp://i.imgur.com/c31IkbM.gifv"
    

    即URL 周围不一定有空格,可以用任何分隔符分隔,或者它们之间根本没有分隔符,您可以使用以下方法:

    def process_images(raw_input)
      return [] if raw_input.nil?
      urls = raw_input.split('http')
      urls.shift
      urls.map { |url| "http#{url}".strip.split(/[\s\,\;]/)[0] }
    end
    

    希望对你有帮助!

    【讨论】:

      【解决方案6】:
      require 'uri'    
      foo = #<URI::HTTP:0x007f91c76ebad0 URL:http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg>
      foo.to_s
      => "http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg"
      

      编辑:解释

      对于那些在通过 JSON 响应解析 URI 或使用 Nokogiri 或 Mechanize 等抓取工具时遇到问题的人,此解决方案对我有用。

      【讨论】:

      • 也许你应该解释你的答案?如果它确实是一个答案?
      • 补充说明。
      • 这毫无意义,而且语法不正确。
      猜你喜欢
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 2019-01-06
      • 2019-08-19
      相关资源
      最近更新 更多