2014-02-26 53 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}" 
...