0

yahoo.finance.com Web サイト用の小さなスクレーパーを作成しています。このリクエストを行うと:

symbol = 'AAPL'

@page = Nokogiri::HTML(open("http://finance.yahoo.com/q?s=#{symbol.upcase}&ql=1"))

def marketCap(symbol)
  @page.xpath("//*[(@id = \"yfs_j10_#{symbol.downcase}\")]").text
end

puts marketCap(symbol)

同じ結果を 2 回出力します。

「495.74B495.74B」

ソース コードを確認したところ、タグに 1 回しか表示されていません

<span id="yfs_j10_f">51.74B</span>

代わりに css セレクターを使用すると、同じ問題が発生します。

それはバグですか、それとも私が間違えましたか?

ありがとう。

4

2 に答える 2

1
@page.xpath("//*[(@id = \"yfs_j10_#{symbol.downcase}\")]").text

正しくありません。

xpath配列に似たNodeSetを返します。2つの要素textが含まれている場合は、両方が含まれます。

@page.xpath("//*[(@id = \"yfs_j10_#{symbol.downcase}\")]").size
=>2

代わりに、を使用at_xpathして最初のものを見つけてください。

@page.at_xpath("//*[(@id = \"yfs_j10_#{symbol.downcase}\")]").text
=> "495.74B"

さて、私が通常より複雑で読みにくいと感じるXPathを使用する代わりに、アクセサーにCSSを使用することをお勧めします。

@page.at("#yfs_j10_#{symbol.downcase}").text
=> "495.74B"

またはatの代わりに使用したことに注意してください。XPathまたはCSSのどちらを渡しているかを検知します。これは一般的なものであり、どちらを使用するかを誤解する可能性がありますが、使用するのも簡単です。またはの代わりに同じことが当てはまります。他の2つと同様にNodeSetを返しますが、使用するアクセサーのタイプを検出します。at_cssat_xpathatsearchcssxpath

于 2013-01-06T21:46:01.963 に答える
0

問題を解決しました。別のセレクターと競合していたようです。

これで問題は解決しました

def marketCap(symbol)
  @page.css("#yfi_comparison #yfs_j10_#{symbol.downcase}").text
end
于 2013-01-06T21:51:37.127 に答える