【问题标题】:Nokogiri - find the value inside a javascript arrayNokogiri - 在 javascript 数组中查找值
【发布时间】:2015-08-27 02:44:08
【问题描述】:

我正在尝试使用 nokogiri 报废一些东西,我想获取 JavaScript 数组中的值,例如这段代码中 'b' 的值。

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

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

【问题讨论】:

  • 我不认为 nokogiri 可以做到这一点,但可能一个 Javascript Parser 可以帮助它? github.com/tenderlove/rkelly
  • 另一种选择是从字符串中删除数组,然后使用 JSON 解析器解析数组并提取正确的元素。

标签: javascript ruby xml nokogiri


【解决方案1】:

所以首先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)

然后您可以遍历 then 节点并使用它们的值。你的例子似乎有点不完整,所以我不能提供更多。如果您想进一步询问b,您将需要更多设置值的js。如果需要,您可以从这里使用 execjs 或 ruby​​ racer 来评估 js。

希望这会有所帮助!

【讨论】:

  • 能举个例子吗?迭代和解析是如何工作的?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2017-12-02
    • 2011-09-26
    • 2019-12-12
    • 2015-10-05
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多