Nokogiri - 在 javascript 数组中找到值

Nokogiri - find the value inside a javascript array

我正在尝试使用 nokogiri 删除某些内容,我想获取 JavaScript 数组中的值,例如此代码中 'b' 的值。

<script>
     var foo = [bar, [a, b, c , d], value, some value, . . ]
</script>

我使用doc.search("script")[18].content得到了脚本块,我如何在这里得到'b'的值?

所以首先 install gem rkelly-remix,rkelly 似乎被遗弃了,remix 执行 es6(sweet)。

需要 '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。

希望对您有所帮助!

你可以很容易地做到这一点:

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 源中的所有内容都是一个字符串,因此一旦您缩小了要查看的范围,就可以使用正常的字符串处理将其分解。