5

我是nodejs的新手。我想使用 jsdom 来解析一些可能包含脚本代码的网页。但我得到错误说函数或变量没有定义。任何人都可以为此提供一些指导。

我的代码

var jsdom = require('jsdom');

jsdom.env({
  html: 'http://10.200.0.10:8080/test/a.html',
  scripts: [
    'http://code.jquery.com/jquery-1.5.min.js'
  ],
  done: function(errors, window) {
    var $ = window.$;
    window.onload();
    console.log(window.a);
  }
});

和这里的html页面

<html>
<head>
    <script>
    var a = 0;
    function loads(){
        a=1000;
    }
    </script>
</head>
<body onload='loads()'>
</body>
</html>

并在下面收到错误消息

dfddddfdf
undefined:1: ReferenceError: loads is not defined
loads()
^
ReferenceError: loads is not defined
    at unknown source
    at /root/node_modules/jsdom/node_modules/contextify/lib/contextify.js:10:24
    at /root/node_modules/jsdom/lib/jsdom/level1/core.js:1024:50
    at /root/testnode.js:18:12
    at Array.0 (/root/node_modules/jsdom/lib/jsdom.js:199:39)
    at EventEmitter._tickCallback (node.js:192:40)

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
ReferenceError: loads is not defined
    at unknown source
    at /root/node_modules/jsdom/node_modules/contextify/lib/contextify.js:10:24
    at /root/node_modules/jsdom/lib/jsdom/level1/core.js:1024:50
    at /root/testnode.js:18:12
    at Array.0 (/root/node_modules/jsdom/lib/jsdom.js:199:39)
    at EventEmitter._tickCallback (node.js:192:40)

它报告未定义加载函数,但实际上已在网页中声明。

任何人都可以提供一些建议,或者只是简单地告诉我 jsdom 无法处理嵌入在页面中的脚本。

4

2 回答 2

10

这是您想要的代码:

var fs = require('fs');
var jsdom = require('jsdom');
var doc   = jsdom.jsdom(fs.readFileSync("a.html"), null, {
          features: {
            FetchExternalResources   : ['script'],
            ProcessExternalResources : ['script'],
            MutationEvents           : '2.0',
        }
    });

var window = doc.createWindow();
jsdom.jQueryify(window, "http://code.jquery.com/jquery-1.5.min.js", function() {
    console.log(window.a);
    console.log(window.$().jquery); //jquery version
});

您的代码将不起作用,因为该jsdom.env方法不处理脚本。

于 2012-04-17T08:04:01.320 回答
0

请注意,您应该使用很棒的 npm 库请求

试试这个:

var http = require('http'),
    jsdom = require('jsdom'), 
    request = require('request');

var server = http.createServer(function (request, response) {
    getPage("http://isohunt.com/torrents/?iht=-1&ihq=life+is+beautiful", function (body) {
        jsdom.env({
            html: body,
            scripts: ['http://code.jquery.com/jquery-1.6.min.js']
        }, function(err, window){
            var $ = window.jQuery;
            //your code goes here

        });
    })
});
server.listen(3000);

function getPage(someUri, callback) {
    request({uri : someUri}, function (error, response, body) {
       callback(body);
    });
}
于 2012-04-17T08:48:03.583 回答