假设我在一个文档中有这个:
<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
属性且值为alternate
的link
元素。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
属性;然后map
将Nokogiri::XML::Attr
对象的数组转换为仅包含其值的数组(作为字符串)。由于这是方法中的最后一个表达式,因此该数组是返回值。