解码雅虎搜索结果URL

时间:2015-07-26 01:04:38

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

我正在开发一个用Ruby编写的应用程序,并使用selenium来废弃Yahoo搜索结果,并从每个结果页面上的每个链接中提取标题描述和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-

我需要的只是网站的网址,而不是雅虎搜索方面的网址。我被告知这可以通过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)

我有点理解这是如何工作的,但我觉得在使用Selenium的Ruby中这应该更容易。目前,我唯一的解决方法是在新标签页中打开链接并从中获取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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

解码网址本身可以通过ruby URI模块完成。更大的挑战是只将正确的部分排除在路径之外。你可以这样做:

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

这会为您提供匹配内容的列表,因此在您的示例["http://en.wikipedia.org/wiki/Something"]

但要注意这个正则表达式只有在你想要的网址总是在RU =之后出现并且后面是/ RK时才有效。