使用 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 selector。 script.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
有更多更好的方法可以做到这一点,但这对我有用。
我有这段代码可以提取页面上的所有脚本。
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 selector。 script.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
有更多更好的方法可以做到这一点,但这对我有用。