使用Nokogiri我抓了一页,我试图找到总结果失败。
HTML Fragment(doc)
<div class="total_count">
<b>Returned:</b> 97 results
</div>
获取总计数=&gt; 97
doc.search(".total_count").text.gsub(/[^0-9]/,'') #=> 497 !Oops
如何通过
?
它返回的文本是
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">]>]
Nokogiri,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
答案 0 :(得分:2)
首先,除非您想要返回NodeSet,否则请勿使用search
。 NodeSet就像Nodes的数组一样,所以你必须准备迭代它们,否则你会得到一些非常奇怪的结果。
相反,从这样的事情开始:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<div class="total_count">
<b>Returned:</b> 97 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
。非常非常偶尔你必须混合两者,但这应该是一个罕见的例外。
使用libxml(2.8.0)的当前版本的Nokogiri(1.6.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) --- warnings: [] nokogiri: 1.6.0 ruby: version: 2.0.0 platform: x86_64-darwin12.4.0 description: ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0] engine: ruby libxml: binding: extension source: packaged 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 compiled: 2.8.0 loaded: 2.8.0