用Nokogiri刮刮Facebook页面评分

时间:2015-05-10 19:50:13

标签: html ruby-on-rails ruby web-scraping nokogiri

我试图使用Nokogiri来削弱Facebook页面的评级,但我无法得到它以满足我的需求。

让我告诉你:

enter image description here

解析" 4.3"值,然后将其转换为浮点数我做了:

""

然而,这会返回一个空字符串process(opt1, opt2, opt3, opt4, local_clk_1Hz, temp_reg1, temp_reg2, temp_reg3, temp_reg4, cuvant, sec_4) begin if(opt1='1')and(opt2='0')and(opt3='0')and(opt4='0')and(local_clk_1Hz='1') then temp_reg1 <= cuvant; temp_reg2 <= temp_reg1; temp_reg3 <= temp_reg2; temp_reg4 <= temp_reg3;

1 个答案:

答案 0 :(得分:1)

正在发生的一些事情使你无法得到你想要的东西。

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div class="clearfix _15v7 _2103 _5vb9">
  <div class="_4bl7">
    <div class="_2fb5 _2fb4">
      <span class="_3tgt _30zy _2l02">
        "4.3 "
        <span class="_3tgv _30zz">*</span>
      </span>
    </div>
  </div>
</div>
EOT

首先,您使用css查找单个元素。不要那样做。 csssearch一样,返回NodeSet,而不是单个节点:

doc.css('._2l02').class # => Nokogiri::XML::NodeSet
doc.at('._2l02').class # => Nokogiri::XML::Element

差异,以及为什么你应该小心,因为你正在使用text而有点掩饰,但是你会在更复杂的HTML中遇到非常混乱的结果,除非你注意两者的区别

获取值:

doc.at('._2l02').children.first.text # => "\n        \"4.3 \"\n        "
doc.at('._2l02').children.first.text[/[\d.]+/] # => "4.3"
doc.at('._2l02').children.first.text[/[\d.]+/].to_f # => 4.3

doc.at('._2l02').children.first.text从第一个HTML节点的第一个子节点获取文本,其类为_2l02

text[/[\d.]+/]返回数字和小数。

然后它明确航行。

您获得空字符串的原因是因为您获得的值以"开头:

str = "\"4.3 \"" # => "\"4.3 \""
str.to_f # => 0.0

为了解决这个问题,我使用了一种模式来只抓取数字和小数:

str[/[\d.]+/] # => "4.3"
str[/[\d.]+/].to_f # => 4.3

同样的结果也可以通过其他方式实现:

str.delete('"').to_f # => 4.3
str.gsub('"', '').to_f # => 4.3
str[1 .. -2].to_f # => 4.3

这是您使用的程序员选择。