使用 Nokogiri 从脚本中提取变量值 - Ruby/Rails

Extracting variable value from script with Nokogiri - Ruby/Rails

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

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

效果很好,return页面上的所有脚本。但是,这使它变得比需要的更复杂,因为我只需要 1 个脚本,即带有 class“analytics”

的脚本
<script class="analytics">
</script>

但是我找不到一个好方法来通过 class 只隔离那个脚本,否则当我知道我需要的值在这个脚本中时,我必须循环遍历所有其他脚本。

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

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

所以我只想 return 值“pop1”和“1.1.2”

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

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

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

css will take a CSS selectorscript.analytics 找到分析的脚本标签 class。

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

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

以 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

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