如何在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){ ... });