更新:
我发现页面中使用了一个标签“base”,但未能在其中运行 jQuery。如果网站包含该标签,则 jsdom 将无法工作。虽然我不知道为什么。
<base href="http://bbs.18183.com/" />
为了验证这一点,我创建了一个全新的 HTML 文件并放入其中,然后 jsdom 失败了。
我目前正在使用 Node.js,在阅读了如何使用 Node.js 和 jQuery 抓取网页之后,我决定为我创建一个。
于是我安装了express、jsdom等很多东西,发现网页抓取真的很方便。但是后来我发现了一个奇怪的情况,某些特定的页面无法被抓取,而是提示错误如下:
var title = $('title').text();
^
TypeError: undefined is not a function
at H:\animalwar\personal\node\getter\app.js:82:23
at exports.env.exports.jsdom.env.scriptComplete (H:\animalwar\personal\node\
getter\node_modules\jsdom\lib\jsdom.js:207:39)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
这是我的代码:
request({
url:'http://bbs.18183.com/'},
function (err, response, body) {
if(err && response.statusCode !== 200){
console.log('Connection Failure! Fuck GFW');
res.end('Connection Failure! Fuck GFW');
return;
}
jsdom.env({
html: body,
scripts: ['jquery.js']
}, function(err, window){
//Use jQuery just as in a regular HTML page
var $ = window.jQuery;
var title = $('title').text();
console.log('SUCCESSFULLY GOT: ', title );
res.end(title);
}
);
});
在这种情况下,网站“ http://bbs.18183.com/ ”无法正常工作,但许多其他网站都可以正常工作。例如,将其更改为“ http://www.18183.com/ ”,它正在工作。
我猜这是由于“$”的定义的一些冲突,但后来我意识到使用 jsdom.env 页面只是一个 DOM 树。即使我将 $ 更改为其他名称,它仍然不起作用。
有人对这个有了解吗?