【问题标题】:Scraping Facebook page rating with Nokogiri使用 Nokogiri 抓取 Facebook 页面评分
【发布时间】:2015-05-10 19:50:12
【问题描述】:

我正在尝试使用 Nokogiri 抓取 Facebook 页面的评级,但我无法得到它来提供我需要的东西。

让我告诉你:

解析“4.3”值,然后将其转换为浮点数:

fb_page = Nokogiri::HTML(open("https://www.facebook.com/pages/Singe-Vert/113716970402?fref=ts&rf=131302280307240"))
fb_page.css('span._3tgt._30zy._2l02').text.to_f

但是这会返回一个空字符串""

【问题讨论】:

  • 该跨度是否出现在页面的实际源中,还是通过脚本动态添加的?检查“查看源代码”。您提供的图像看起来像是来自检查器,它显示了脚本运行后生成的页面。
  • 刚刚看了一下页面源代码。跨度在那里,除了它在另一个名为 <code class="hidden_elem" id="u_0_15"></code> 的元素中被注释掉。这是什么意思?
  • 看起来页面是使用那些hidden_elem cmets 用javascript 构建的。由于 Nokogiri 只能看到“原始”页面,因此您不能直接使用它来获取所需的信息。也许您可以找到包含该信息的comment() 节点,然后以某种方式解析其内容。
  • 不错的建议,我一定会检查的。
  • 欢迎来到 Stack Overflow。请不要使用屏幕截图来表示数据或传入的 HTML。这迫使我们输入文本只是为了能够帮助您。相反,请复制并粘贴演示问题所需的最少 HTML,以便我们可以重复使用您的输入。

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


【解决方案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 从具有_2l02 类的第一个 HTML 节点的第一个子节点获取文本。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2014-09-22
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    相关资源
    最近更新 更多