使用Nokogiri从Feed中提取网址

时间:2011-08-15 14:23:27

标签: ruby parsing 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 个答案:

答案 0 :(得分:3)

您的CSS选择器错误,entry.alternate将选择具有替代类的所有条目元素(类似于<entry class="alternate" />)。

我想您要选择link属性为rel的所有alternate元素,其值为link[rel=alternate]。 CSS选择器是doc.css('link[rel=alternate]').each do |e| puts e['href'] posts << e['href'] end 。所以改变你的代码:

{{1}}

您可以在此处详细了解CSS选择器:http://www.w3.org/TR/CSS2/selector.html

答案 1 :(得分:1)

尝试使用doc.xpath "//entry/link[@rel='alternate']"代替doc.css('entry.alternate')。它对我有用。

答案 2 :(得分: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个对象数组转换为仅包含其值(作为字符串)的数组。由于这是方法中的最后一个表达式,因此数组是返回值。