0

Nokogiri を使用してページをスクレイピングしましたが、合計結果を見つけようとして失敗しました。

HTML フラグメント (ドキュメント)

<div class="total_count">
    <b>Returned:</b>&nbsp;97&nbsp;results
</div>

その合計数を取得 => 97

doc.search(".total_count").text.gsub(/[^0-9]/,'') #=> 497 !Oops

どうすれば乗り越えられます&nbsp;か?

それが返すテキストはこれです

 doc.search(".total_count").text

"\r\n    Returned:\u00A0497\u00A0results\r\n"

したがって、使用 doc.at(".total_count").text.match('\d+')すると「496」が得られます

ノードは

=> [#<Nokogiri::XML::Element:0x1762914 name="div" attributes=[#<Nokogiri::XML::Attr:0x1762878 name=
class" value="total_count">] children=[#<Nokogiri::XML::Text:0x1767618 "\r\n    ">, #<Nokogiri::XML
:Element:0x1767e1c name="b" children=[#<Nokogiri::XML::Text:0x1767a98 "Returned:">]>, #<Nokogiri::X
L::Text:0x1767834 "\u00A0497\u00A0results\r\n">]>]

のこぎり、Rubyバージョン

C:\Ruby200>nokogiri -v
DL is deprecated, please use Fiddle
# Nokogiri (1.6.0)
    ---
    warnings: []
    nokogiri: 1.6.0
    ruby:
      version: 2.0.0
      platform: i386-mingw32
      description: ruby 2.0.0p247 (2013-06-27) [i386-mingw32]
      engine: ruby
    libxml:
      binding: extension
      source: system
      compiled: 2.8.0
      loaded: 2.8.0
4

1 に答える 1

2

まず、NodeSetsearchを返したくない場合は使用しないでください。NodeSet はNodeの配列のように機能するため、それらを反復する準備をしておく必要があります。そうしないと、非常に奇妙な結果が得られる可能性があります。

代わりに、次のようなものから始めます。

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="total_count">
    <b>Returned:</b>&nbsp;97&nbsp;results
</div>
EOT

doc.at('div').text.scan(/\d+/) # => ["97"]
doc.at('div').text[/\d+/] # => "97"

atセレクターに一致する最初のノードを返します。この場合、それは<div>. クラスセレクターも使用できます。

doc.at('.total_count').text[/\d+/] # => "97"

次に、gsub不要なものを削除するのではなく、正規表現を使用して必要なものに一致させます。その概念を誤解しているコードを繰り返し目にするので、それをマントラにしてください。正規表現を使用する場合、何かを検索またはキャプチャしようとしている場合は、一致を使用します。ものを削除または変更する場合は、またはを使用しsubますgsub。非常に、非常に、時には 2 つを混在させる必要がありますが、それはまれな例外です。

現在のバージョンの Ruby (2.0.0) で libxml (2.8.0) を使用する現在のバージョンの Nokogiri (1.6.0) は、<div>テキスト ノードを返します。

doc.at('div').text # => "\n    Returned:\u00A097\u00A0results\n"

はありません4。何か違うことが見られる場合は、Ruby、Nokogiri、さらには libXML2 をアップグレードする必要があります。

nokogiri -vコマンドラインで使用してバージョン情報を確認できます。次のように表示されます。

# のこぎり (1.6.0)
    ---
    警告: []
    のこぎり:1.6.0
    ルビー:
      バージョン: 2.0.0
      プラットフォーム: x86_64-darwin12.4.0
      説明: ruby​​ 2.0.0p247 (2013-06-27 リビジョン 41674) [x86_64-darwin12.4.0]
      エンジン:ルビー
    libxml:
      バインディング: 拡張子
      出典:パッケージ
      libxml2_path: /Users/tinman/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.0/ports/i686-apple-darwin11/libxml2/2.8.0
      libxslt_path: /Users/tinman/.rbenv/versions/2.0.0-p247/lib/ruby/gems/2.0.0/gems/nokogiri-1.6.0/ports/i686-apple-darwin11/libxslt/1.1.26
      コンパイル済み: 2.8.0
      読み込まれた: 2.8.0
于 2013-08-16T16:00:18.717 に答える