如何在PhantomJS中使用jQuery循环表格行

我试图学习一些networking与node.js刮。 我select了一些示例页面,例如http://www.imdb.com/chart/top 。 然后我试图用评分来刮掉所有的标题。 我创build了一个PhantomJS脚本(我需要使用它,因为它是dynamic的,所以它使用JavaScript上的网站)。 它的工作,但我不知道如何为每个标题循环。

例如:

$('.lister-list tr').each( function(){ $(this).find('.titleColumn').text().replace(/\n/g, ''); $(this).find('.imdbRating').text().replace(/\n/g, ''); } ); 

然后我把它放在一个JSON文件中。 在这一刻,我只能把数据没有循环。 这是我的脚本:

 var phantom = require('phantom'); var fs = require('fs'); phantom.create(function (ph) { ph.createPage(function (page) { page.open("http://www.imdb.com/chart/top", function (status) { page.evaluate(function () { //search datajquer var k_title = $('.lister-list tr .titleColumn').first().text().replace(/\n/g, ''); var k_rating = $('.lister-list tr .imdbRating').first().text().replace(/\n/g, ''); // create json data var metadata = JSON.stringify({ Title: k_title, Rating: k_rating }); return metadata; } , function (result) { //save json data fs.appendFile('java.json', "\n" + result, function (err) { if (err) throw err; console.log('file is updated!'); }); //display data in console console.log('Result: ' + result); ph.exit(); }); }); }); }); 

我怎样才能做一个循环,将循环所有TR元素?

你需要的是一个数组。 你可以初始化一个空数组,并像下面这样将新对象推到它上面:

 page.evaluate(function () { var metadataList = []; $('.lister-list tr').each(function(){ var metadata = { Title: $(this).find('.titleColumn').text().replace(/\n/g, ''), Rating: $(this).find('.imdbRating').text().replace(/\n/g, '') }; metadataList.push(metadata); }); return JSON.stringify(metadataList); }, function(result){ ... }); 

您也可以使用jQuery map()函数将每一行映射到一个对象,并通过这种方式创build一个数组:

 page.evaluate(function () { var metadataList = $('.lister-list tr').map(function(){ return { Title: $(this).find('.titleColumn').text().replace(/\n/g, ''), Rating: $(this).find('.imdbRating').text().replace(/\n/g, '') }; }).get(); return JSON.stringify(metadataList); }, function(result){ ... }); 

注意,必须在map()结果上调用get() ,以检索实际的数组而不是jQuery对象。

你不需要jQuery来做到这一点:

 page.evaluate(function () { var metadataList = []; [].forEach.call(document.querySelectorAll('.lister-list tr'), function(tr){ var metadata = { Title: tr.querySelector('.titleColumn').textContent.replace(/\n/g, ''), Rating: tr.querySelector('.imdbRating').textContent.replace(/\n/g, '') }; metadataList.push(metadata); }); return JSON.stringify(metadataList); }, function(result){ ... });