【问题标题】:Decode Yahoo search results URL's解码 Yahoo 搜索结果 URL
【发布时间】:2015-10-16 10:19:25
【问题描述】:

我正在开发一个用 Ruby 编写的应用程序,它使用 selenium 来清除 Yahoo 搜索结果,并从每个结果页面上的每个链接中提取标题描述和 URL。

我的问题是 URL 看起来像这样:

http://r.search.yahoo.com/_ylt=AwrBTzoAL7RVc9sAXT9XNyoA;_ylu=X3oDMTByOHZyb21tBGNvbG8DYmYxBHBvcwMxBHZ0aWQDBHNlYwNzcg--/RV=2/RE=1437900673/RO=10/RU=http%3a%2f%2fen.wikipedia.org%2fwiki%2fSomething/RK=0/RS=wtfzdVploHxkh.UDtV9YvqVD56w-

我需要的只是网站的 URL,而不是它的 Yahoo 搜索端。有人告诉我,这可以通过 PHP 使用这样的函数来实现:

function translateurl($line) { 
$c="0123456789abcdef" ;
for ($a=0;$a<16;++$a) { for ($b=0;$b<16;++$b)
$tr["%".$c[$a].$c[$b]]=chr(($a*16)+$b) ; }
$a=explode("http",$line) ; $b=explode("/",$a[2]) ; $u="http".$b[0]; 
$url=strtr($u,$tr) ; return $url ; 
}

除了以下部分之外,我已经能够将其全部转换为 Ruby:

$tr["%".$c[$a].$c[$b]]=chr(($a*16)+$b)

我有点理解这是如何工作的,但我觉得在 Ruby 中使用 Selenium 应该会更容易。目前,我唯一的解决方法是在新选项卡中打开链接并从那里获取 URL。但是这样做需要很多时间,而且在不打开链接的情况下转换 URL 会更容易。

我当前的 Ruby 代码:

def translate_url(url)
       c='0123456789abcdef'
       for a in 0..16
         for b in 0..16
           tr = ['%' + c[a] + c[b]]
           tr((a*16)+b).ord
         end
       end

       a = ('http' + url).split(', ')

       b = ('/' + a[2]).split(', ')

       u = ('http' + b[0])

       return_url = strtr(u,tr)
       return_url
end

有什么想法吗?

【问题讨论】:

  • 抓取雅虎搜索?确保这不违反他们的条款;)
  • 我没有看到任何违反他们条款的事情。

标签: php ruby-on-rails ruby selenium web-scraping


【解决方案1】:

可以通过 ruby​​ URI 模块对 url 本身进行解码。更大的挑战是只把正确的部分排除在外。你可以这样做:

URI.decode(yahoo_url).match(%r{RU=(.*)/RK}).captures

这会给你一个匹配内容的列表,所以在你的例子中["http://en.wikipedia.org/wiki/Something"]

但请注意,此正则表达式仅在您想要的 url 始终位于 RU= 之后且后跟 /RK 时才有效。

【讨论】:

  • 正是我所需要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2020-03-19
  • 2011-05-03
  • 2013-02-09
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多