2017-04-07 6 views
1

Ich bin neu bei Python und ich arbeite an einem Lernprojekt, bei dem ich versuche, einige Daten über College-Football-Spieler zu kratzen. Der Quellcode für die Website sieht wie folgt aus:Schöne Suppe: Datenwerte nicht übereinstimmend Überschriften

</thead> 
    <tbody> 


> <tr ><th scope="row" class="right " data-stat="year_id" ><a 
> href="/cfb/years/1957.html">1957</a></th><td class="left " 
> data-stat="school_name" csk="San Jose State.1957" ><a 
> href="/cfb/schools/san-jose-state/1957.html">San Jose 
> State</a></td><td class="left " data-stat="conf_abbr" ><a 
> href="/cfb/conferences/independent/1957.html">Ind</a></td><td 
> class="center " data-stat="class" ></td><td class="center " 
> data-stat="pos" >RB</td><td class="right " data-stat="g" >10</td><td 
> class="right " data-stat="rec" >1</td><td class="right " 
> data-stat="rec_yds" >6</td><td class="right " 
> data-stat="rec_yds_per_rec" >6.0</td><td class="right " 
> data-stat="rec_td" >0</td><td class="right " data-stat="rush_att" 
> >1</td><td class="right " data-stat="rush_yds" >3</td><td class="right " data-stat="rush_yds_per_att" >3.0</td><td class="right " 
> data-stat="rush_td" >0</td><td class="right " data-stat="scrim_att" 
> >2</td><td class="right " data-stat="scrim_yds" >9</td><td class="right " data-stat="scrim_yds_per_att" >4.5</td><td class="right 
> " data-stat="scrim_td" >0</td></tr> 

Hier ist, wie weit habe ich mit meinem Code bekommen:

headers = [item["data-stat"] for item in soup.find_all(attrs={"data-stat" : True})] 
cellStrings = [cell.find(text = True) for cell in soup.findAll('td')] 
print headers, cellStrings 

Dies gibt die folgenden:

[u'', u'header_receiving', u'header_rushing', u'header_scrimmage', u'year_id', u'school_name', u'conf_abbr', u'class', u'pos', u'g', u'rec', u'rec_yds', u'rec_yds_per_rec', u'rec_td', u'rush_att', u'rush_yds', u'rush_yds_per_att', u'rush_td', u'scrim_att', u'scrim_yds', u'scrim_yds_per_att', u'scrim_td', u'year_id', u'school_name', u'conf_abbr', u'class', u'pos', u'g', u'rec', u'rec_yds', u'rec_yds_per_rec', u'rec_td', u'rush_att', u'rush_yds', u'rush_yds_per_att', u'rush_td', u'scrim_att', u'scrim_yds', u'scrim_yds_per_att', u'scrim_td', u'year_id', u'school_name', u'conf_abbr', u'class', u'pos', u'g', u'rec', u'rec_yds', u'rec_yds_per_rec', u'rec_td', u'rush_att', u'rush_yds', u'rush_yds_per_att', u'rush_td', u'scrim_att', u'scrim_yds', u'scrim_yds_per_att', u'scrim_td'] [u'San Jose State', u'Ind', None, u'RB', u'10', u'1', u'6', u'6.0', u'0', u'1', u'3', u'3.0', u'0', u'2', u'9', u'4.5', u'0', u'San Jose State', None, None, None, None, u'1', u'6', u'6.0', u'0', u'1', u'3', u'3.0', u'0', u'2', u'9', u'4.5', u'0'] 

Die Problem ist, dass einige der Überschriften früher im Quellcode angezeigt werden, sodass die beiden Listen, Daten und Überschriften, nicht übereinstimmen.

Meine Frage ist, wie kann ich den "Daten-stat" zusammen mit seinem zugehörigen Wert ziehen, anstatt sie getrennt zu ziehen? Im Idealfall würde ich dies als Wörterbuch ziehen.

Antwort

0

Wenn ich Sie richtig verstehe, wollen Sie ein Wörterbuch bestehend aus {'data-stat-value': 'value of td'}; Sie können etwas tun:

data_stats = {e['data-stat']: e.get_text().strip() 
       for e in html.find_all(attrs={'data-stat': True})} 

diese Weise ist es sicher, den Text mit diesem data-stat Tag zugeordnet wird ziehen.