2014-02-26 55 views
0

我檢索來自cnn.com網站上最新的新聞報道,並寫了一個簡單的腳本引入nokogiri做到這一點:解析Nokogiri時消除CSS選擇器?

url = "http://edition.cnn.com/?refresh=1" 
doc = Nokogiri::HTML(open(url)) 
puts doc.at_css("title").text 
    doc.css("#cnn_maintt2bul div+ div a").each do |headline| 
    article = headline.text 
    puts "#{article}" 
end 

的問題是,CNN職位的文章和視頻鏈接的混合物。現在我只對文章而不是視頻感興趣。例如,當我運行此腳本時,它將檢索所有文章,但在文章鏈接到視頻時留下空間。

Pakistan airstrikes kill dozens 
Could U.S. leave Afghanistan? 
Editor's stabbing draws outrage 
Ukrainian city fears uprising 

U.S. hate groups in decline 

這意味着Ukrainian city fears uprising實際上會鏈接到視頻。它會這樣做,直到它檢索到最後一篇文章。

我發現文章有一個名爲.cnnVideoIcon的選擇器。有關我如何消除這種情況的任何想法,從而將鏈接到視頻的文章從我的結果中刪除?

如何在解析時消除這些鏈接?它們可能出現在任

+1

你能提供一個鏈接到你刮網站? – Severin

回答

2

我看着CNN網站的HTML源代碼,發現「麗」視頻標題的標籤有四個子元素,並且只有三個包含文字標題的子元素。

<li class="c_hpbullet3" data-vr-contentbox=""> 
    <span class="cnnPreWOOL"></span> 
    <a href="/video/data/2.0/video/world/2014/02/25/ctw-ukraine-political-aftermath-ian-bremmer-intv.cnn.html?hpt=hp_t5">Ukrainian politics remain in flux</a> 
    <span class="cnnPostWOOL"></span> &nbsp; 
    <a href="/video/data/2.0/video/world/2014/02/25/ctw-ukraine-political-aftermath-ian-bremmer-intv.cnn.html?hpt=hp_t5" target=""><img class="cnnVideoIcon" width="16" height="10" border="0" alt="Ukrainian politics remain in flux" src="http://i.cdn.turner.com/cnn/.e/img/3.0/global/icons/video_icon.gif"></a> 
</li> 

因此,我們可以使用下面的XPath語法:

doc.xpath("//div[@id='cnn_maintt2bul']/div/div/ul/li[count(*)=3]/a").each do |headline| 
    article = headline.text 
    puts "#{article}" 
end 
+0

我如何獲得每篇文章的鏈接,使其可以點擊並檢索每篇文章的第一段。 –

+0

你能幫我解決這個問題嗎?http://stackoverflow.com/questions/22055544/getting-visiting-and-limiting-the-number-of-links-using-nokogiri-and-mechanize –

0

您應該使用CSS屬性以外的內容來查找所需的標籤。使用search而不是css,併爲其指定一個XPath,它只選擇沒有鏈接到視頻的元素作爲子項。

當您提供要從中獲取信息的網站的真實URL時,我將使用指定的XPath更新答案。

+0

該網址是上面顯示的腳本中的確切網址。 –

0

如果你看一下你從http://edition.cnn.com/?refresh=1刮塊的源代碼,你會發現,視頻與視頻圖標(無文本)的鏈接,就像這樣:

<a href="/video/data/..."> 
    <img class="cnnVideoIcon" alt="Ukrainian city fears uprising" ... 
     height="10" width="16"> 
</a> 

這解釋了爲什麼你得到一些空行。

#cnn_maintt2bul div + div a:empty 

使用a:empty,你將只檢索沒有圖像或其他元素的鏈接裏面,或者,換句話說,與描述文本的所有鏈接:

你可以使用一個更精緻的選擇像跳過這些鏈接只要。


另一個(次優的)方法是簡單地跳過空行與if聲明:

doc.css("#cnn_maintt2bul div + div a").each do |headline| 
article = headline.text 
if (article != "") 
    puts "#{article}" 
...