2011-08-15 297 views
1

飼料拉着一個URL比方說,我有這樣的一個文件中:使用引入nokogiri

<entry> 
    <link rel="replies" type="application/atom+xml" href="http://www.url.com/feeds/1/comments/default" title="Comments"/> 
    <link rel="alternate" type="text/html" href="http://www.url.com/a_blog_post.html" title="A Blog Post"/> 
</entry> 

<entry> 
    <link rel="replies" type="application/atom+xml" href="http://www.url.com/feeds/2/comments/default" title="Comments"/> 
    <link rel="alternate" type="text/html" href="http://www.url.com/another_blog_post.html" title="Another Blog Post"/> 
</entry> 

我試圖用引入nokogiri拉網址爲每個博客帖子,但我顯然會約這一切錯誤的(我是新來的編程和無法理解引入nokogiri)

這是我有:

require 'nokogiri' 
require 'open-uri' 

def get_posts(url) 
    posts = [] 
    doc = Nokogiri::HTML(open(url)) 
    doc.css('entry.alternate').each do |e| 
    puts e['href'] 
    posts << e['href'] 
    end 
    return posts 
end 

puts "Enter feed url:" 
url = gets.chomp 
posts = get_posts(url) 
puts posts.to_s 

任何幫助將是巨大的!我開始這個小東西,以更好地學習編程,但我卡住了。我的輸出目前是[]

回答

3

您的CSS選擇器是錯誤的,entry.alternate會選擇具有備用類的所有條目元素(類似於<entry class="alternate" />)。

我想你想選擇所有link元素rel屬性的值爲alternate。這個CSS選擇器是link[rel=alternate]。因此,改變你的代碼是這樣的:

doc.css('link[rel=alternate]').each do |e| 
    puts e['href'] 
    posts << e['href'] 
end 

你可以閱讀更多關於CSS選擇在這裏:http://www.w3.org/TR/CSS2/selector.html

+0

<3謝謝sooo多。我明白你的答案。感謝您的鏈接,我將不得不研究CSS選擇器。 :) –

1

請使用doc.xpath "//entry/link[@rel='alternate']"而不是doc.css('entry.alternate')來嘗試。這個對我有用。

+0

那麼整個行會是這樣嗎?: doc.css('entry.alternate')。each do | e | –

+0

Nop。它會是'doc.xpath(「// entry/link [@ rel ='alternate']」)。每個都是| e |' – Serabe

+0

大聲笑,這就是我的意思是鍵入我的評論。我把它放在我的腳本中,但遇到了方法錯誤。但是,感謝您的幫助。 –

1

如果你只是想鏈接的href屬性,注意,您可以更簡單地做:

def get_posts(url) 
    Nokogiri::XML(open(url)) 
    .xpath('//link[@rel="alternate"]/@href') 
    .map(&:value) 
end 

中的XPath上述選擇並非link元素,但這些元素href屬性; map然後將這個Nokogiri::XML::Attr對象的數組轉換爲一個只有它們的值的數組(作爲字符串)。由於這是方法中的最後一個表達式,因此該數組是返回值。