0

这是我的代码:

doc= Nokogiri::HTML(open("http://www.cincinnatisun.com/index.php?rss/90d24f4ad98a2793", 'User-Agent' => 'ruby'))
search=doc.css('item')
if !search.blank?
  search.each do |data|
    title=data.css("title").text

    link=data.css("link").text
  end
end

但我没有得到链接。

4

2 回答 2

0

根据http://nokogiri.org/tutorials/searching_a_xml_html_document.html类似:

@doc = Nokogiri::XML(File.read("feed.xml"))
@doc.xpath('//xmlns:link')

应该做的工作。但请注意,您提供的 xml 片段根本不是有效的 xml 提要(没有根元素,未打开项目标签 - 仅关闭等)。该代码假定 xml 提要看起来即

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <item>
    <title>Atom-Powered Robots Run Amok</title>
    <link>http://example.org/2003/12/13/atom03</link>
  </item>
</feed>

并提取:

<link>http://example.org/2003/12/13/atom03</link>

结果。如果您有这样的问题,请先尝试查看文档/参考。如果您尝试了某些东西但没有像您期望的那样工作,那么您可以使用实际代码咨询 stackoverflow - 这样可以更容易地理解您的问题并提供帮助。

于 2013-01-21T12:26:07.107 回答
0

有几件事是错误的:

if !search.blank?

将不起作用,因为search它将是由doc.css. NodeSet没有blank?办法。也许你的意思是empty?

title=data.css("title").text

不是找到的正确方法,title因为就像上面的问题一样,你得到的是 NodeSet 而不是 Node.js。从 NodeSet获取text可能会返回很多您不想要的垃圾。而是这样做:

title=data.at("title").text

将代码更改为:

require 'nokogiri'
require 'open-uri'

doc= Nokogiri::HTML(open("http://www.cincinnatisun.com/index.php?rss/90d24f4ad98a2793", 'User-Agent' => 'ruby'))
search=doc.css('item')
if !search.empty?
  search.each do |data|
    title=data.at("title").text
    link=data.at("link").text
    puts "title: #{ title } link: #{ link }"
  end
end

输出:

标题:前孟加拉虎拉拉队诉讼审判开始链接:
标题:自由中心提供周一免费入场链接:
标题:迈阿密大学乐队在就职游行中表演 链接:
标题:北肯塔基人将在就职典礼上展示色彩 链接:
标题:John Gumms 周一预报链接:
标题:奥巴马总统副总统拜登宣誓就职正式开始第二任期链接:
标题:Colerain Township 必胜客星期六晚上抢劫链接:
标题:寒潮来到三州链接:
标题: 2 名男子在肯塔基州北部被警方追捕后被捕 链接:

link不起作用,因为 XML 格式不正确,根据我的经验,这在 Internet 上非常普遍,因为人们没有花时间检查他们的工作。

该修复将在 Nokogiri 接收内容之前对 XML 进行按摩,或者修改您的访问器。幸运的是,这个特定的 XML 很容易解决,所以这应该会有所帮助:

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open("http://www.cincinnatisun.com/index.php?rss/90d24f4ad98a2793", 'User-Agent' => 'ruby'))
search = doc.css('item')
if !search.empty?
  search.each do |data|
    title = data.at("title").text
    link = data.at("link").next_sibling.text
    puts "title: #{ title } link: #{ link }"
  end
end

哪个输出:

标题:前孟加拉虎啦啦队诉讼审判开始链接:http://www.cincinnatisun.com/index.php/sid/212072454/scat/90d24f4ad98a2793
标题:自由中心提供周一免费入场链接:http://www.cincinnatisun.com/index.php/sid/212072914/scat/90d24f4ad98a2793
标题:迈阿密大学乐队在就职游行中表演链接:http://www.cincinnatisun.com/index.php/sid/212072915/scat/90d24f4ad98a2793
标题:北肯塔基人将在就职典礼上展示色彩链接:http://www.cincinnatisun.com/index.php/sid/212072913/scat/90d24f4ad98a2793
标题:John Gumms 周一预报链接:http://www.cincinnatisun.com/index.php/sid/212070535/scat/90d24f4ad98a2793
标题:奥巴马总统副总统拜登宣誓就职正式开始第二任期链接:http://www.cincinnatisun.com/index.php/sid/212060033/scat/90d24f4ad98a2793
标题:Colerain 乡必胜客星期六晚上被抢劫链接:http://www.cincinnatisun.com/index.php/sid/212057132/scat/90d24f4ad98a2793
标题:寒潮来到三州链接:http://www.cincinnatisun.com/index.php/sid/212057131/scat/90d24f4ad98a2793
标题:肯塔基州北部警方追捕后逮捕 2 名男子链接:http://www.cincinnatisun.com/index.php/sid/212057130/scat/90d24f4ad98a2793

完成所有这些后,您可以更清楚地编写代码,例如:

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open("http://www.cincinnatisun.com/index.php?rss/90d24f4ad98a2793", 'User-Agent' => 'ruby'))
doc.css('item').each do |data|
  title = data.at("title").text
  link = data.at("link").next_sibling.text
  puts "title: #{ title } link: #{ link }"
end

有趣的是,现在示例页面的链接似乎已修复。

于 2013-01-21T21:11:16.843 回答