2017-04-12 8 views
0

Ich habe zwei Fragen.scraping probsssss

  1. Ich versuche, den Wert von propval zu bekommen, aber wenn ich den Schaber renne, bekomme ich nur eine leere Schnur zurück. Sollte ich neben Filter eine andere Methode verwenden oder wähle ich nicht das richtige Element? Ich habe versucht verschiedene Elemente, aber es tut das gleiche.

  2. Kann ich eine Schleife verwenden, um jede einzelne Tabellenzeile zu durchsuchen, um alle Prop-Wert-IDs zu sammeln, oder gibt es einen effizienteren Weg?

const express = require('express'); 
const fs = require('fs'); 
const request = require('request'); 
const cheerio = require('cheerio'); 
var app = express(); 

app.get('/scrape', function(req, res) { 


url = 'http://streak.espn.com/en/'; 

request(url, function(error, response, html){ 
    if(!error) { 
     var $ = cheerio.load(html); 

     var gameQuestion, propVal; 
     var json = { gameQuestion : "", propVal : ""}; 

     $('.gamequestion').each(function(){ 
      var data = $(this) 
      gameQuestion = data.text(); 

      json.gameQuestion = gameQuestion; 

     }) 

     $('a#.matchupDiv').each(function() { 
      var data = $(this); 

      propVal = data.text(); 

      json.propVal = propVal; 
     }) 
    } 


    fs.writeFile('output.json', JSON.stringify(json, null, 4), function(err){ 

     console.log('File successfully written! - Check your project directory for the output.json file'); 
    }) 

    res.send('Check your console!') 

    }); 
}) 



app.listen('8081') 

console.log('magic happens on port 8081'); 

exports = module.exports = app; 

<tbody> 
    <tr> 
     <td rowspan = "2" class='mg-column1 start'></td> 
     <td rowspan = "2" class='mg-column2 start'></td> 
     <td rowspan = "2" class='mg-column3 start'></td> 
      <div class="mg-check" propval="m57207o58439" name="matchupDiv">nbsp;</div> 

Antwort

0

Die jQuery .filter() Funktion entweder ein Element nimmt, einen Wähler, eine Funktion oder ein anderes Objekt jQuery (http://api.jquery.com/filter/). Da Sie eine Funktion in den Filter übergeben, erwarten Sie, dass Sie einen booleschen Wert (einen Wahr/Falsch-Wert) zurückgeben.

Was Sie wahrscheinlich verwenden möchten, ist die .each() Funktion. (http://api.jquery.com/jquery.each/). Wenn Sie eine Klasse abfragen, erhalten Sie ein Array übereinstimmender Objekte zurück. .each() wird durch das Array durchlaufen und Sie könnten tun, was Sie dort zu tun versuchen. Versuch es einmal.

HINZUGEFÜGT ***** Ich habe mir den Quellcode angesehen, und es gibt keine Klasse propval. Sie benötigen eine Abfrage zu ändern:

$('.mg-check').attr('propVal')

Aber .mg-check scheint keine Kinder zu haben. Was versuchst du genau zu kratzen?

EDITED *** Um ein Array der propVals zu bekommen, versuchen Sie dies:

ändern Initialisierung Ihrer json.propVal''-[], dann ...

$('.mg-check').each(function(){ json.propVal.push($(this).attr('propVal')) });

+0

können Sie mit der '.each()' Methode für '$ ('. mg-check'). attr ('propVal')'? –

+0

BC, wenn ich versuche, sie zu verketten, bekomme ich einen Fehler –

+0

'$ ('. Mg-check')' wird ein Array von Elementen zurückgeben, da es mehrere Elemente mit dieser Klasse gibt. Vielleicht ist die bessere Syntax: '$ ('. Mg-check'). Je (function() {json.propVal.push ($ (this) .attr ('propVal'))});' um die propVals zu speichern in einem Array. Das bedeutet, dass Sie die Initialisierung von 'json.propVal' (und von' json.gameQuestion') zu einem leeren Array machen müssen. Auf diese Weise können Sie auch die Push - Methode auf Ihrer 'gameQuestion' verwenden, so dass Sie eine Reihe von Fragen haben, nicht nur die letzte Frage in der – wlh