2016-09-09 5 views
1

Ich habe Python-Skript geschrieben, um Daten von http://www.cricbuzz.com/cricket-stats/icc-rankings/batsmen-rankings zu kratzen Es ist eine Liste von 100 Spielern und ich kratzte erfolgreich diese Daten. Das Problem ist, wenn ich Script statt Scraping Daten nur ein einziges Mal scrapped die gleichen Daten 3 mal.Ich möchte Daten mit Python-Skript scratzen

<div class="cb-col cb-col-100 cb-font-14 cb-lst-itm text-center"> 
 
    <div class="cb-col cb-col-16 cb-rank-tbl cb-font-16">1</div> 
 
    <div class="cb-col cb-col-50 cb-lst-itm-sm text-left"> 
 
    <div class="cb-col cb-col-33"> 
 
     <div class="cb-col cb-col-50"> 
 
     <span class=" cb-ico" style="position:absolute;"></span>&nbsp;&nbsp;&nbsp;&nbsp;– 
 
     </div> 
 
     <div class="cb-col cb-col-50"> 
 
     <img src="http://i.cricketcb.com/i/stats/fw/50x50/img/faceImages/2250.jpg" class="img-responsive cb-rank-plyr-img"> 
 
     </div> 
 
    </div> 
 
    <div class="cb-col cb-col-67 cb-rank-plyr"> 
 
     <a class="text-hvr-underline text-bold cb-font-16" href="/profiles/2250/steven-smith" title="Steven Smith's Profile">Steven Smith</a> 
 
     <div class="cb-font-12 text-gray">AUSTRALIA</div> 
 
    </div> 
 
    </div> 
 
    <div class="cb-col cb-col-17 cb-rank-tbl">906</div> 
 
    <div class="cb-col cb-col-17 cb-rank-tbl">1</div> 
 
</div>

Und hier ist Python-Skript, das ich Schrott jeder Spieler Daten schreiben.

import sys,requests,csv,io 
 
from bs4 import BeautifulSoup 
 
from urllib.parse import urljoin 
 

 
url = "http://www.cricbuzz.com/cricket-stats/icc-rankings/batsmen-rankings" 
 
r = requests.get(url) 
 
r.content 
 
soup = BeautifulSoup(r.content, "html.parser") 
 

 
maindiv = soup.find_all("div", {"class": "text-center"}) 
 
for div in maindiv: 
 
\t print(div.text)

sondern einmal die Daten von Schaben, kratzt es die gleichen Daten 3 mal.

Wo kann ich Änderungen vornehmen, um Daten nur einmal zu erhalten?

Antwort

1

Wählen Sie die Tabelle und sucht den divs, dass:

maindiv = soup.select("#batsmen-tests div.text-center") 
for div in maindiv: 
    print(div.text) 

Ihre ursprüngliche Ausgabe und das oben bekommt die gesamten Text aus der divs als eine Zeile, die nicht wirklich nützlich, wenn Sie nur die Spieler wollen Namen:

anchors = soup.select("#batsmen-tests div.cb-rank-plyr a") 
for a in anchors: 
    print(a.text) 

eine schnelle und einfache Möglichkeit, die Daten in einem schönen csv-Format zu erhalten, ist nur Text von jedem Kind zu bekommen:

maindiv = soup.select("#batsmen-tests div.text-center") 
for d in maindiv[1:]: 
    row_data = u",".join(s.strip() for s in filter(None, (t.find(text=True, recursive=False) for t in d.find_all()))) 
    if row_data: 
     print(row_data) 

Jetzt erhalten Sie eine Ausgabe wie:

# rank, up/down, name, country, rating, best rank 
1,–,Steven Smith,AUSTRALIA,906,1 
2,–,Joe Root,ENGLAND,878,1 
3,–,Kane Williamson,NEW ZEALAND,876,1 
4,–,Hashim Amla,SOUTH AFRICA,847,1 
5,–,Younis Khan,PAKISTAN,845,1 
6,–,Adam Voges,AUSTRALIA,802,5 
7,–,AB de Villiers,SOUTH AFRICA,802,1 
8,–,Ajinkya Rahane,INDIA,785,8 
9,2,David Warner,AUSTRALIA,772,3 
10,–,Alastair Cook,ENGLAND,770,2 
11,1,Misbah-ul-Haq,PAKISTAN,764,6 

Im Gegensatz zu:

PositionPlayerRatingBest Rank 
Player 
1    –Steven SmithAUSTRALIA9061 
2    –Joe RootENGLAND8781 
3    –Kane WilliamsonNEW ZEALAND8761 
4    –Hashim AmlaSOUTH AFRICA8471 
5    –Younis KhanPAKISTAN8451 
6    –Adam VogesAUSTRALIA8025 
+0

ja es hat den Trick und jetzt mein Skript sieht gut aus :) –

+0

@hrmalik, keine Sorgen, habe ich hinzugefügt, wie die Daten in ein besser nutzbares Format zu trennen. –

+0

Ich nehme an, die gleiche Aufgabe zu tun, aber ich konnte keinen Weg finden, Daten wie komma-getrennte Werte zu machen, aber du bist einfach nur das Ziel mit deinem Trick exzellent: * –

-1

Der Grund, warum Sie Ausgabe dreimal bekommen ist, weil die Website drei Kategorien hat Sie haben, um es auszuwählen und dann entsprechend können Sie benutze es.

einfachste Weg, es mit Ihrem Code zu tun wäre nur eine Zeile

import sys,requests,csv,io 
from bs4 import BeautifulSoup 

url = "http://www.cricbuzz.com/cricket-stats/icc-rankings/batsmen- rankings" 
r = requests.get(url) 
r.content 
soup = BeautifulSoup(r.content, "html.parser") 

specific_div = soup.find_all("div", {"id": "batsmen-tests"}) 
maindiv = specific_div[0].find_all("div", {"class": "text-center"}) 
for div in maindiv: 
    print(div.text) 

Dies gibt ähnliche reuslts mit nur Test batsmen hinzufügen, bei anderem Ausgang nur die „id“ Linie in specific_div ändern.

+0

Dies ist genau das, was mein Code bar unnötige Verwendung von find_all tut –

+0

Nein, es gibt es nicht nur die 100 Einträge, Ihre geben 300 Ergebnisse. Das ist der Grund, warum ich schreibe ein extra find_all –

+0

Nein meins gibt nicht 300. Es gibt 100 und gibt ihnen in brauchbaren Format –