2013-08-16 29 views
0

使用Nokogiri我已经刮了一个页面,我试图找到总结果失败。如何处理使用Nokogiri时使用

HTML片段(DOC)

<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">]>] 

引入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

你试过'.text.match('\ d +')'? – 2013-08-16 15:56:57

+0

http://www.vitarara.org/cms/hpricot_to_nokogiri_day_1说@tenderlove建议'gsub(/ \ 302 \ 240 /,'')' - 详细阅读 –

+1

为什么当HTML显示为'97'时会得到'496' ',并且Nokogiri代码显示'497'。在进行测试并报告结果时请保持一致。 –

回答

2

首先,除非您想要返回NodeSet,否则请勿使用search。 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删除你不想要的东西,使用正则表达式来匹配你想要的东西。我反复看到那些让这个概念错误的代码,所以把它作为一个口头禅。使用正则表达式时,如果您尝试查找或捕获某些内容,请使用匹配项。如果您要移除或更换东西,请使用subgsub。非常非常偶尔你必须混合两者,但它应该是一个罕见的例外。

使用的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