2013-05-28 27 views
1

更新:为什么'base'标记阻止了jsdom.env的工作?

我发现了,我没能在运行jQuery的网页所使用的标签“基地”如果网站包含标签jsdom是行不通的。虽然我不知道为什么。

<base href="http://bbs.18183.com/" /> 

为了验证这一点,我创建了一个全新的HTML文件,并把里面,然后jsdom失败。


我目前使用的是Node.js玩耍,读书How to Scrape Web Pages with Node.js and 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树。尽管我将$改为其他名称,但它仍然无效。

有没有人知道这件事?

回答

2

我看到这里发生了什么。这不是一个错误,但我可以看到它出乎意料。以下是发生了什么:

scripts: ['jquery.js']翻译为“插入<script src="jquery.js">”。当jsdom看到<script src="jquery.js">时,它会尝试加载相对于当前文档的URL的jquery.js

在没有<base>标记的文档中,当您使用HTML片段字符串而不是通过URL显式加载它们时,文档URL将被设置为对应于当前脚本的file:// URL。我敢打赌,jquery.js就在您当前的剧本旁边,所以效果很好:<script src="jquery.js">解决得很好。

但在具有<base>标记的文档中,文档的URL被设置为该基地。因此<script src="jquery.js">在这种情况下转化为加载<base href="http://localhost/jquery.js">,我敢打赌,你没有在本地主机端口80上运行的服务器上可用的jquery.js。所以这失败了。

解决方法是更明确。我建议像

var path = require("path"); 

jsdom.env({ 
    html: myHTML, 
    scripts: [path.resolve(__dirname, "jquery.js")], 
    done: function (errors, window) { 
    } 
}); 

需要注意的是,如果你检查你errors变量,你可能会看到,给你一个线索错误。你似乎没有任何这样的错误处理代码。

相关问题