我试图使用Nokogiri来削弱Facebook页面的评级,但我无法得到它以满足我的需求。
让我告诉你:
解析" 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;
答案 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
查找单个元素。不要那样做。 css
与search
一样,返回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
这是您使用的程序员选择。