获取脚本标记内的代码

时间:2016-07-20 21:29:06

标签: jquery node.js cheerio

我用nodejs和cheerio抓取网站。如何获得Test的值。

这是我正在抓取的代码。

<body>
   <div>Hello</div>
<script>
var Test = "www.example.com";
</script>
</body>

如何获取变量Test的值?

1 个答案:

答案 0 :(得分:1)

您首先需要获取脚本标记的原始内容(您可以使用cheerio),一旦您在标记内部使用了javascript,就可以选择:

  • 安全但紧密耦合代码结构:使用正则表达式查找文字值:

var value = /\sTest\s*=\s*"([^"]*)"/.exec(js)[1]

  • 安全且灵活,但更复杂(性能更高)。如果代码太复杂而无法使用正则表达式,并且替代方法是获取该js代码的AST,然后您只是遍历AST以找到您正在寻找的文字,那么您可以在线尝试Esprima了解AST是什么以及它是什么样的:http://esprima.org/demo/parse.html

对于您分享的示例,AST如下所示:

var ast = {
    "type": "Program",
    "body": [
        {
            "type": "VariableDeclaration",
            "declarations": [
                {
                    "type": "VariableDeclarator",
                    "id": {
                        "type": "Identifier",
                        "name": "Test"
                    },
                    "init": {
                        "type": "Literal",
                        "value": "www.example.com",
                        "raw": "\"www.example.com\""
                    }
                }
            ],
            "kind": "var"
        }
    ],
    "sourceType": "script"
}

// you can use something smarter to look for "Test" variable declaration here
var value = ast.body[0].declarations[0].init.value;

  • 不安全,讨厌(参见“eval is evil”),但又快又灵活:

// assumes js code is declaring a variable named "Test"
var value = eval(js + '; Test;');

// a slightly better approach that prevents adding variables to the global scope:
var value = eval('(function(){ ' + js + '; return Test; })();')

大警告,如果您对该脚本标记的内容没有完全信任,请不要使用此eval方法,您将作为node.js应用的一部分运行,创建脚本注入漏洞的一种形式。