0

Using Nokogiri I have scraped a page and I am trying to find the total results unsuccessfully.

HTML Fragment (doc)

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

Get that total count => 97

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

How can I get past &nbsp; ?

The text it returns is this

 doc.search(".total_count").text

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

So using doc.at(".total_count").text.match('\d+') gives "496"

The node is

=> [#<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">]>]

Nokogiri, Ruby Versions

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

search首先,除非您希望返回 NodeSet,否则不要使用。NodeSet 就像一个Nodes数组,所以你必须准备好迭代它们,否则你会得到一些非常奇怪的结果。

相反,从这样的事情开始:

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来删除你不想要的东西,而是使用正则表达式来匹配你想要的东西。我反复看到代码错误地理解了这个概念,所以把它当作口头禅。使用正则表达式时,如果您要查找或捕获某些内容,请使用匹配。如果您要删除或更改内容,请使用subor gsub。非常非常,偶尔你会不得不将两者混合,但这应该是一个罕见的例外。

当前版本的 Nokogiri (1.6.0) 使用 libxml (2.8.0),在当前版本的 Ruby (2.0.0) 上返回<div>文本节点:

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

没有4,所以如果你看到任何不同的东西,那么你需要升级 Ruby、Nokogiri 甚至你的 libXML2。

nokogiri -v您可以使用命令行检查版本信息。您应该会看到如下内容:

# Nokogiri (1.6.0)
    ---
    警告:[]
    nokogiri:1.6.0
    红宝石:
      版本:2.0.0
      平台:x86_64-darwin12.4.0
      描述:ruby 2.0.0p247(2013-06-27 修订版 41674)[x86_64-darwin12.4.0]
      引擎:红宝石
    库xml:
      绑定:扩展
      来源:打包
      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 回答