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によって返される NodeSet になるため、機能しませんdoc.cssNodeSetにはメソッドがありませんblank?。おそらくあなたは意味しましたempty?か?

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

title上記の問題のように、Node の代わりに NodeSet を取得しているため、を見つける正しい方法ではありません。NodeSettextから取得すると、不要な大量のガベージが返される可能性があります。代わりに次のようにします。

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

出力:

タイトル: 元ベンガルズ チアリーダーの裁判を開始するための訴訟 リンク:
title: 月曜日に無料で入場できるフリーダム センター リンク:
タイトル: 就任パレードで演奏するマイアミ大学バンド リンク:
タイトル: ノーザン ケンタッキー州の男性が就任式で色を提示する リンク:
title: John Gumms 月曜日の予報リンク:
title: オバマ大統領、バイデン副大統領が正式に就任し、第 2 期を開始 リンク:
タイトル: コールレイン タウンシップ ピザハット、土曜の夜に強盗に遭う リンク:
タイトル: コールド スナップが Tri-State に登場 リンク:
title: ケンタッキー州北部での警察の追跡後に逮捕された 2 人の男性 リンク:

XMLのlink形式が正しくないため、これは機能しません。私の経験では、これはインターネット上で信じられないほど一般的です。

修正には、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 Monday Forecast リンク: http://www.cincinnatisun.com/index.php/sid/212070535/scat/90d24f4ad98a2793
タイトル: オバマ大統領、バイデン副大統領が正式に就任し、第 2 期を開始 リンク: http://www.cincinnatisun.com/index.php/sid/212060033/scat/90d24f4ad98a2793
タイトル: コールレイン タウンシップ ピザハット 土曜日の夜に強盗 リンク: http://www.cincinnatisun.com/index.php/sid/212057132/scat/90d24f4ad98a2793
タイトル: コールド スナップが Tri-State に登場 リンク: 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 に答える