让我说我在文件中有这个:
<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
任何帮助都会很棒!我开始这个小东西,以便更好地学习编程,但我被卡住了。我的输出目前是[]
答案 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
个对象数组转换为仅包含其值(作为字符串)的数组。由于这是方法中的最后一个表达式,因此数组是返回值。