2016-04-21 4 views
4

Das ist mein html zu analysieren:cheerio Parse h2 mit einem href und Spanne

 <h2 class="offer-header"> 

     <a class="offer-title" href="http://address.com/id/2">Item name</a> 
    </h2> 

     <div class="offer-price"> 


     <span class="offer-buy-now buy-now"> 
      <span class="statement"> 
       1 999,00 $ 


        <span class="label">buy now</span> 

      </span> 
     </span> 
    </div> 
// many the same elements 

Parse href und Link Wert, es ist ok. Aber ich habe ein Problem, den Preis zu analysieren. Ich bekomme Ausgabe mit vielen Leerzeichen und \ n. Ich möchte den gleichen Preis ohne buy now zeigen.

Meine Beispielausgabe für Preise

2 497,00 $ 


     buy now 




    2 379,00 $ 


     buy now 

Code:

request(task.url, function(err, resp, body){ 

        if(body) { 
        $ = cheerio.load(body); 
        links = $('a.offer-title'); 
        $(links).each(function (i, link) { 

         //console.log($(link).attr('href')); 
         var price = $('span.offer-buy-now').text(); 
         console.log(price); 
         //items[k] = items[k] || []; 
         //items[k] = new itemParam($(link).text(), 12, k); 
         k++; 

        }); 

        } 
        callback(); 
}); 

Wie es zu beheben?

EDIT:

ich richtig foreach-Schleife und es ist funktioniert. Aber ich habe ein anderes Problem. Ich bekomme nicht immer die Antwort mit den Daten, nur für 3,4,5 Anruf bekommt Ergebnisse. Vielleicht stimmt etwas mit meiner Anfrage nicht?

router.route('/send') 
    .post(function(req, res){ 

     var url = req.body.url; 
     var items = []; 
     var k=0; 
     var q = async.queue(function(task, callback){ 

      console.log(task.url); 
      if(task.url.length>=1) { 

       if (isURL(task.url)) { 
       console.log('OK'); 


       request(task.url, function(err, resp, body){ 

        if(body) { 
        $ = cheerio.load(body); 
        links = $('div.offer-info'); 

        $(links).each(function (i, link) { 

         console.log($(link).find('a.offer-title').attr('href')); 
         var price = $(link).find('span.offer-buy-now').text().replace(/[^0-9.]/g, ""); 
         console.log(price); 
         items[k] = items[k] || []; 
         items[k] = new itemParam($(link).find('a.offer-title').text(), 
         price,$(link).find('a.offer-title').attr('href'), k); 
         k++; 

        }); 

        } 
        callback(); 
       }); 

       } else { 
       errorHandling(res, 401,"Invalid url"); 
       } 
      }else{ 
       errorHandling(res, 401,"Invalid url"); 
      } 

     } 
    ); 


     q.push({url: url+'&p=1'}); 

     q.drain = function(errr, p) { 
     console.log('all items have been processed' + items.length); 
     for (var i=0; i<items.length; i++) { 

      console.log(items[i].name + ' | ' + items[i].id + ' | ' + items[i].price); 

     } 
     res.sendStatus(200); 
     }; 
    }); 

Antwort

1

Entfernen Sie einfach kaufen jetzt mit replace Methode entfernen Sie dann den Leerraum mit trim().

links = $('a.offer-title'); 
$(links).each(function(i, link) { 

    //console.log($(link).attr('href')); 
    var price = $('span.offer-buy-now').text().replace('buy now', '').trim(); 
    console.log(price); 
    //items[k] = items[k] || []; 
    //items[k] = new itemParam($(link).text(), 12, k); 
    k++; 

}); 

andere Lösung

oder Sie können einfach alle Elemente innerhalb Spanne .statement durch $('span.statement *').remove(); entfernen, dann können Sie Ihre text

Demo erhalten:

links = $('a.offer-title'); 
 
$(links).each(function(i, link) { 
 

 
    //console.log($(link).attr('href')); 
 
    $('span.statement *').remove(); 
 
    var price = $('span.statement').text().trim(); 
 
    console.log(price); 
 
    //items[k] = items[k] || []; 
 
    //items[k] = new itemParam($(link).text(), 12, k); 
 
    k++; 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<h2 class="offer-header"> 
 
    <a class="offer-title" href="http://address.com/id/2">Item name</a> 
 
</h2> 
 
<div class="offer-price"> 
 
    <span class="offer-buy-now buy-now"> 
 
      <span class="statement"> 
 
       1 999,00 $ 
 

 

 
        <span class="label">buy now</span> 
 

 
    </span> 
 
    </span> 
 
</div>

+0

Ok, aber ich sollte auf 'statement' von' $ (link) 'verweisen, sonst wird mir alles eine Zeile anzeigen. – lukassz

+0

versuchen Sie die erste Lösung, die es für Sie arbeiten wird. – Gintoki

+0

Ich versuche das, aber es funktioniert nicht – lukassz

1

Sie können mit alles von Zeichenfolge außer Zahlen entfernen:

var price = $('span.offer-buy-now').text().replace(/[^0-9.]/g, ""); 

DEMO:

var str = "2 497,00 $   buy now"; 
 
strreplaced = str.replace(/[^0-9.]/g, ""); 
 
alert(strreplaced);

+0

es funktioniert nicht :( – lukassz

+0

@lukassz: Ich habe 'g' Kennung für Regex. check now –

+0

@lukassz: willst du summe aller preise? –