2016-05-16 14 views
-1

ich mit Röntgen, das ist groß, aber Mangel an Tutorial. Wie auch immer, ich benutze eine Reihe von URLs namens URLs. In der Schleife ruft jede URL auf und gibt das Ergebnis durch Rückruf zurück. in der Callback-Funktion muss ich wissen, was die URL war, die geparst wurde. Wie kann ich wissen, welche URL zurückgegeben wird, wenn der Callback nur Fehler und Ergebnisse zurückgibt? (Ist es wirklich eine Röntgen Frage oder js)NodeJS Röntgen-Web-Scraper: mehrere URLs in einer Schleife Rückruf

xrayRamiLevy = function(){ 
    var index = 0; 
    for (index; index < urls.length; index++){ 
    x(urls[index].url, '.product_item', 
    [{ 
     title : '.prodDescDiv h3', 
     description : '.prodBrand', 
     imageUrl : '.image_icons_zone .image [email protected]', 
     onclick : '.image_icons_zone .image a @onclick', 
    }] 
) 
(function(err, results){ 
    for (var i = 0; i < results.length; i++){ 

     var s = results[i].onclick.substr(0, results[i].onclick.lastIndexOf("'")); 
     s = s.slice(s.lastIndexOf("'") + 1); 
     results[i].catalogueNumber = s; 
     delete results[i].onclick; 
     if (results[i].description !== undefined && results[i].description.length > 0) 
     s = results[i].description.replace(/\s+/g, ' ').trim(); 
     results[i].description = s; 

     if (urls[index].category !== undefined && urls[index].category.length > 0) 
     results[i].categoriesIds = urls[index].category; 

     if (urls[index].subcategory !== undefined && urls[index].subcategory.length > 0) 
     results[i].subcategoriesIds = urls[index].subcategory; 

    } 
    fs.writeFile("./results.json", JSON.stringify(results, null, '\t')); 
}); 

} }

Antwort

1

ich nicht ganz Ihr Beispiel bekommen habe, JEDOCH:

urls.forEach(function(url, index){ 
    //whatever you need to do to prep your call to x 
var callback = x(url, '.product_item', ...); 
callback(wrappedCallback(url)); 
} 

function wrappedCallback(url) { 
    return function(err, results){ 
    // url is defined here 
    } 
}; 
1

Siehe Beispiel für die URL bekommen JS-Schließung verwenden. Beachten Sie, dass die URL aus dem Array im fn-Callback verfügbar ist.

var Xray = require('x-ray'); 
var util = require('util'); 
var x = Xray(); 

var sitesToHandle = ['https://dribbble.com?x=1', 'https://dribbble.com?x=2']; 
sitesToHandle.forEach((urlToHandle) => { 
    x(urlToHandle, 'li.group', [{ 
    title: '.dribbble-img strong', 
    image: '.dribbble-img [data-src]@data-src', 
    }]).(function (err, results) { 
    console.log(`let's now handle the result of ${urlToHandle}, the results are ${util.inspect(results)}`); 
    }); 
}); 

p.s. Randnotiz, wenn Sie die zurückgegebenen Fehler behandeln, können Sie einen Fehler behandeln, der I just wrote here

+0

Danke @Yonatan sollte ich das $ -Zeichen wirklich verwenden? woher kommt der util.inspect? – dang

+0

Nein, es ist nur eine Variable innerhalb einer Zeichenfolge enthalten. Auch der util.inspect wird verwendet, um Objekte in das Protokoll zu drucken, es ist nicht notwendig – Yonatan