2017-02-16 52 views
2

我想要做網頁抓取,並且我想以JSON格式顯示數據。如何定位行中的第一個ID

我的任務是從網站中提取每篇文章,並以JSON格式顯示其相關數據。我的問題是,我似乎無法定位行(),然後針對每個ID。我可以在我的代碼中輸入id,但我希望程序能夠通過seacrh獲得id,並且控制檯會記錄該行中每個id的數據。 例如:我想通過id獲得第一篇文章的標題。

我希望我有道理。 網站我試圖從數據中提取: here

我的代碼:

var express = require('express'); 
var path = require('path'); 
var request = require('request'); 
var cheerio = require('cheerio'); 
var fs = require('fs'); 
var app = express(); 
var port = 8080; 

var url= "https://news.ycombinator.com/"; 

request(url, function(err,resp,body){ 
var $ = cheerio.load(body); 

    var title = $('tr'); 

    var uri 
    var author 
    var points 
    var comments 
    var rank 

    var posts = { 
     postTitle : title, 
     postUri : uri, 
     postAuthor : author, 
     postPoints : points, 
     postComments : comments, 
     postRank : rank 
    } 

    console.log(posts) 

    }) 

    app.listen(port); 
    console.log('server is listening on' + port); 
+0

我甚至不知道這是可能使用jQuery sintaxe與...的NodeJS,但我認爲,要實現你想要什麼,你需要安裝' jquery'使用npm。 [見這個線程](http://stackoverflow.com/questions/1801160/can-i-use-jquery-with-node-js)。如果你提到它的'身體是相同的圖像,那麼我認爲你可以得到你想要的東西使用jquery nodejs插件 –

回答

1

與hackernews的訣竅是三個要素TR顯示一行。這就是爲什麼rows的每個元素都繼承了tr三個後續元素。在rows.map裏面,每個item是一行,你可以訪問屬性「rowwise」。

let cheerio = require('cheerio') 
let request = require('request'); 

const url = "https://news.ycombinator.com/"; 
request(url, function(err,resp,body){ 
    let $ = cheerio.load(body); 

    const tr = $('.itemlist > tr'); 
    let rows = Array((tr.length - 2)/3); //the last two are the More button 

    for (var i = 0; i < (tr.length - 2)/3; ++i){ 
    rows[i] = tr.slice(3*i, 3*(i+1)); 
    } 

    res = rows.map(function(item, index) { 
    return { 
     postTitle: $(item).find('.storylink').text(), 
     postUri: $(item).find('.storylink').attr('href'), 
     postComments: $(item).find('a+ a').text(), 
    } 
    }) 

    console.log(res); 

}) 

它給你:

[ { postTitle: 'CockroachDB beta-20161013', 
    postUri: 'https://jepsen.io/analyses/cockroachdb-beta-20161013', 
    postComments: '10 comments' }, 
    { postTitle: 'Attacking the Windows Nvidia Driver', 
    postUri: 'https://googleprojectzero.blogspot.com/2017/02/attacking-windows-nvidia-driver.html', 
    postComments: '7 comments' }, 
    { postTitle: 'DuckDuckGo Donates $300K to Raise the Standard of Trust Online', 
    postUri: 'https://spreadprivacy.com/2017-donations-d6e4e4230b88#.kazx95v27', 
    postComments: '25 comments' }, 
... ] 
+0

謝謝@ Floo0這工作完美 – EyedFox1

+0

我如何返回值的評論作爲一個整數? – EyedFox1

+0

JSON格式不支持類型,所以我假設你想'postComments:'25''而不是'postComments:'25 comments''。要做到這一點看看正則表達式。你可以做一些像'const comment_pattern = new RegExp('^ [0-9] +')',然後將postComments行打包爲'comment_pattern.exec('25 comments')[0]' – Rentrop

相關問題