我正在尝试使用nokogiri废弃某些内容,我想在JavaScript数组中获取值,就像此代码中的“b”值一样。
<script>
var foo = [bar, [a, b, c , d], value, some value, . . ]
</script>
我使用doc.search("script")[18].content
获取了脚本块,如何在此处获取'b'的值?
答案 0 :(得分:1)
首先install gem rkelly-remix
,rkelly似乎已经放弃了,remix做了es6(甜蜜的)。
要求'rkelly'并实例化解析器parser = RKelly::Parser.new
然后像以下那样抓住脚本:
doc = '<script> var foo = [bar, [a, b, c , d], 1, 2, 3, 4] </script>'
d = Nokogiri::HTML doc
js = d.search('script').text
接下来用Rkelly-remix解析它。
ast = parser.parse(js)
然后你可以迭代节点并使用它们的值。你的例子看起来有点不完整,所以我不能提供比这更多的东西。如果你想进一步询问b
,你需要更多设置值的js。从这里你可以使用execjs或ruby racer来评估你的js。
希望这有帮助!
答案 1 :(得分:0)
你可以很容易地做到这一点:
require 'nokogiri'
doc = Nokogiri::HTML('<script>
var foo = [bar, [a, b, c , d], value, some value, . . ]
</script>
')
js = doc.at('script').text
right_side = js.split('=', 2).last
b = right_side.split(',')[2]
b # => " b"
使用实际值进行测试:
require 'nokogiri'
doc = Nokogiri::HTML('<script>
var foo = [bar, [a, 123, c , d], value, some value, . . ]
</script>
')
js = doc.at('script').text
right_side = js.split('=', 2).last
b = right_side.split(',')[2]
b # => " 123"
b.to_i # => 123
缺点是它容易受到JavaScript字符串格式化的影响,这使得它很脆弱。你可以决定是否要走这条路。
请记住,HTML源代码中的所有内容都是字符串,因此一旦缩小了要查看的内容,就可以使用常规字符串处理来解决问题。