2017-03-23 44 views
1

NodeJS新手在這裏。我正在嘗試使用NodeJS和PhamtomJS解析html(phantomjs-node)。當我從瀏覽器控制檯運行JQuery $("[class*='question-summary']")時,它會返回一個數組。但是,我無法在nodejs上做同樣的事情。我猜stackoverflow有JQuery,所以我不需要使用includeJs加載jquery。其實,當我運行NodeJs + PhantomJs從page.evaluate方法返回JQuery結果

這裏是我正在運行的nodejs示例;

var phantom = require('phantom'); 

async function getHtml() { 
    const instance = await phantom.create([ 
     "--load-images=false"  
    ]); 

    const page = await instance.createPage(); 
    await page.on("onResourceRequested", function(requestData) { 
     console.info('Requesting', requestData.url) 
    }); 

    const status = await page.open('http://stackoverflow.com'); 
    console.log("STATUS: " + status); 

    const content = await page.property('content'); 
    console.log(content); 

    var result = await page.evaluate(function(content) { 
        return $("[class*='question-summary']"); 
       }); 

    console.log("Result : " + result); 
    await instance.exit(); 
}; 

getHtml(); 

我用命令>node --harmony-async-await phantomTest.js運行。將內容打印到控制檯後,該過程會卡住。

+0

我想node.js是一個硬性要求?只是在PhantomJS中這樣做會簡單得多。 – Vaviloff

+0

這不是一個難的要求,但我會嘗試執行一個cron作業來解析和保存一些數據。我想學習nodejs。 – quartaela

+0

我只是想說明你可以爲PhantomJS編寫腳本,從cron運行它們,它們會更簡單,沒有異步/等待/承諾的東西。 – Vaviloff

回答

2

在這裏回答我自己的問題。在評估函數內部創建一個數組,並在內部推送元素。我想唯一的限制是phantom-node只支持返回對象與原語。

var result = await page.evaluate(function() { 
    var questionSummaries = []; 
    $("[class*='question-summary']").each(function() { 
     questionSummaries.push(this.innerHTML); 
    }); 
    return questionSummaries; 
});