使用Nokogiri从提要中提取URL



假设我在一个文档中有这个:

<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来拉出每个博客文章的url,但我显然是在这一切都错了(我是编程新手,很难理解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

任何帮助将是伟大的!我开始做这个小东西是为了更好地学习编程,但我被困住了。我当前的输出是[]

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

我假设您要选择所有具有rel属性且值为alternatelink元素。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.

尝试用doc.xpath "//entry/link[@rel='alternate']"代替doc.css('entry.alternate')

如果您只想要链接的href属性,请注意,您可以更简单地执行:

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

上面的XPath不是选择link元素,而是选择这些元素的href属性;然后mapNokogiri::XML::Attr对象的数组转换为仅包含其值的数组(作为字符串)。由于这是方法中的最后一个表达式,因此该数组是返回值。

相关内容

  • 没有找到相关文章

最新更新