2014-01-09 51 views
2

我正在使用Nokogiri从网页中提取RSS链接。但是,由于一些网站在其HTML上有绝对路径和其他相对路径,我想这样做是为了使网站具有相对路径时,它将成为绝对路径。提取与Nokogiri的RSS链接

这里是我的代码:

require 'nokogiri' 
require 'simple-rss' 
require 'open-uri' 


ARGV.map! { |http| "http://#{http}"} 
ARGV.each do |website| 
doc = Nokogiri::HTML(open(website)) 
rss_path = doc.xpath("//link[@type=\"application/rss+xml\"]").map do |link| 
    if link['href'] =~ /^http:\/\/[a-z]*\..*\//i 
     puts link['href'] 
    else 
     puts "#{website}#{link['href']}" 
    end 
end 

所以,如果我是在命令行中,我会键入rubyweekly.com像

ruby rss.rb 8gramgorilla.com rubyweekly.com 

的代码工作正常,这对于相对路径它的RSS,但8gramgorilla.com有一个绝对路径,所以我希望它只是立即输出,没有http://8gramgorilla.com/http://8gramgorilla.com/feed作为输出。基本上,发生的事情是IF语句被忽略,它立即转到else语句。

回答

2

if声明不被忽略,它正在评估为false。您的正则表达式为/^http:\/\/[a-z]*\..*\//i,因此它正在寻找http://后跟任意数量的a-z(或.,因为零a-z也将匹配)。但网址是http://8gramgorilla.com,第一个字符是数字8,它不在范围a-z

最直接的解决办法是将您的正则表达式更改为包含数字,可能类似/^http:\/\/[\da-z]*\..*\//i(其中已添加\d)。

您可能可以简化更多的正则表达式,也许只需检查网址是否匹配http://就足够了。

更健壮的解决方案是正确解析相关url,或许使用Addressable gemURI module in Ruby’s standard lib

+0

谢谢!我尝试添加\ d并将其简化为“http://”匹配,并且它的功能就像一个魅力。 – steph

0

没有必要的,如果,只是做:

require 'uri' 
puts URI.join(website, link['href']).to_s 
0

要检测RSS提要纽约时报http://www.nytimes.com

<link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml"> 

我会使用以下方法来提取href值来自application/rss+xml链接标签:

require 'nokogiri' 
require 'httparty' 
url = 'http://www.nytimes.com' 
resp = HTTParty.get(url) 
doc = Nokogiri::HTML(resp.body) 
feed = doc.css("link[type='application/rss+xml']").map{|link|link[:href]}.first 

这将返回RSS提要值的网站:

http://www.nytimes.com/services/xml/rss/nyt/HomePage.xml 

注意,如果网站不application/rss+xml标签,代码将简单地返回nil