【问题标题】:Extracting variable value from script with Nokogiri - Ruby/Rails使用 Nokogiri 从脚本中提取变量值 - Ruby/Rails
【发布时间】:2021-05-22 23:07:34
【问题描述】:

我有这段代码可以拉入页面上的所有脚本。

full_url = URI.join(url, "/").to_s #https://www.example.com

doc = Nokogiri::HTML(URI.open(full_url))

doc.css('script').each do |script|
    puts script.content
end

这很好用,可以返回页面上的所有脚本。然而,这使得它比它需要的更复杂,因为我只需要 1 个脚本,一个具有“分析”类的脚本

<script class="analytics">
</script>

但是我找不到一种只按类隔离该脚本的好方法,否则当我知道我需要的值在这个脚本中时,我必须遍历所有其他脚本。

现在我遇到的第二个问题是脚本中有一堆函数和 try/catch 等。 其中我只需要这两行的值:

window.TEST.gameName = "pop1";
window.TEST.gameVersion = "1.1.2";

所以我只想返回值“pop1”和“1.1.2”

window.TEST.gameName 和 window.TEST.gameVersion 只有 1 个实例,因此它们是唯一的。也许我使用 Nokogiri 过于复杂了,我应该只使用正则表达式还是这样会更快?

我也不喜欢 Nokogiri,只是这似乎是最受欢迎的选择。

我尝试了一些使用 doc.at 和 doc.search 的变体,但我一直没有得到任何回报,所以我可能做错了。

【问题讨论】:

    标签: ruby-on-rails ruby nokogiri


    【解决方案1】:

    css 将采用CSS selectorscript.analytics 查找分析类的脚本标签。

    doc.css('script.analytics').each do |script|
        puts script.content
    end
    

    至于第二部分,window.TEST.gameName = "pop1"; 是 Javascript。 Nokogiri 帮不了你。你需要一个 Javascript 解析器。

    【讨论】:

      【解决方案2】:

      以 Schwern 的问题为基础并回答完整的问题。

      我用过

      doc.css('script.analytics').each do |script|
          @script = script.content
      end
      

      这给了我大约一百行 javascript 的脚本,总是采用相同的格式,只是值不同。

      然后我做了:

      game_name = @script.match(/window.TEST.gameName = "(.*?)";/m)[1].strip # returns pop1
      game_version = @script.match(/window.TEST.gameVersion = "(.*?)";/m)[1].strip # returns 1.1.2
      

      可能有更好的方法来做到这一点,但这对我有用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 1970-01-01
        • 2020-09-05
        • 2016-06-13
        • 1970-01-01
        相关资源
        最近更新 更多