【问题标题】:Extract URLs from String (Ruby) (Regex and link shortened)从字符串(Ruby)中提取 URL(正则表达式和链接缩短)
【发布时间】:2018-05-09 01:48:07
【问题描述】:

我听说URI::extract() 只返回带有: 的链接,但是由于我正在抓取一条推文,并且它不包含:,我相信我必须使用正则表达式。我需要检查“swoo.sh/whatever”链接,并将其存储到变量中。但是,关于我必须维护/ 之后的所有内容,我怎么能找到第一个(它显然会自动返回)“swoo.sh/whatever”链接。例如,如果推文说

Lorem ipsum lorem ipsum swoo.sh/12xfsW lorem ipsum

我如何获取 swoo.sh 链接,以及直接出现在 / 之后的所有不同内容?

【问题讨论】:

  • swoo.sh 修复了吗?
  • 我假设此类链接在 twitter 上是可点击的,这意味着原始 HTML 中将包含实际的 URI,从而使这项任务变得微不足道。您确定不能使用不同的 API/scraper 来获取推文的实际 HTML 内容吗?

标签: ruby regex uri


【解决方案1】:

这是使用match的一种方法:

match = /(\w+\.\w+\/\w+)/.match("Lorem ipsum lorem ipsum swoo.sh/12xfsW lorem ipsum")
if match
    puts match[1]
else
    puts "no match"
end

Demo

如果您还需要同时捕获完整 URL 的能力,那么我的答案必须更新。这只会回答您的直接问题。

【讨论】:

  • 谢谢。只需您回答我的直接问题!
【解决方案2】:

我们可以利用 URI 不能包含空格的事实,而 Ruby 有 URI::Generic,它几乎可以解析任何看起来像 URI 的东西。然后我们只需要过滤掉非网络URI,我假设每个网络URI都必须以foo.bar之类的开头

require 'uri'
require 'pathname'

tweet.
  split.
  map { |s| URI.parse(s) rescue nil }.
  select { |u| u && (u.hostname || Pathname(u.path).each_filename.first =~ /\w\.\w/) }

示例输出

tweet = 'foo . < google.com bar swoosh.sh/blah?q=bar http://google.com/bar'
# the above returns
# [#<URI::Generic google.com>, #<URI::Generic swoosh.sh/blah?q=bar>, #<URI::HTTP http://google.com/bar>]

由于模棱两可,这通常不能真正起作用。 “car.net”看起来像一个缩短的链接,但在上下文中它可能是“我的邻居从我的窗户扔了一个棒球,所以我从他的 car.net 增益中猛拉轮毂驾驶室!!!”,这显然只是一个缺失的空间。

【讨论】:

    猜你喜欢
    • 2015-03-10
    • 2018-06-23
    • 1970-01-01
    • 2011-07-24
    • 2011-09-02
    • 2010-10-04
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多