Nokogiri - 在javascript数组中找到值

时间:2015-06-11 12:00:53

标签: javascript ruby xml nokogiri

我正在尝试使用nokogiri废弃某些内容,我想在JavaScript数组中获取值,就像此代码中的“b”值一样。

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

我使用doc.search("script")[18].content获取了脚本块,如何在此处获取'b'的值?

2 个答案:

答案 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源代码中的所有内容都是字符串,因此一旦缩小了要查看的内容,就可以使用常规字符串处理来解决问题。