【问题标题】:Pulling a URL from a feed using Nokogiri使用 Nokogiri 从提要中提取 URL
【发布时间】:2011-08-15 14:23:26
【问题描述】:

假设我在文档中有这个:

<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

任何帮助都会很棒!我开始这个小东西是为了更好地学习编程,但我被困住了。我目前的输出是[]

【问题讨论】:

    标签: ruby parsing nokogiri


    【解决方案1】:

    您的 CSS 选择器错误,entry.alternate 将选择所有具有备用类的条目元素(类似于 &lt;entry class="alternate" /&gt;)。

    我想您想选择所有具有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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那么整行会是这样吗?:doc.css('entry.alternate').each do |e|
    • 没有。应该是doc.xpath("//entry/link[@rel='alternate']").each do |e|
    • 大声笑,这就是我在评论中输入的意思。我把它放在我的脚本中,但遇到了一个方法错误。不过,感谢您的帮助。
    • 你能粘贴错误吗?我宁愿使用 xpath 而不是 css 选择器,因为 Nokogiri 将 css 转换为 xpath 然后运行它。例如,它为上面的 CSS 选择器创建 xpath "//link[@rel = 'alternate']"(您可以使用 Nokogiri::CSS.xpath_for 方法检查它)。翻译器非常快,将您的 CSS 选择器翻译 100000 次只需不到半秒。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多