2016-10-03 5 views
0

美しいスープを使用してページを繰り返していましたが、何らかの理由でループを最初のページを超えて進めることはできません。それはテキスト文字列なので簡単だと思われますが、ループバックするようですが、おそらくそれは私のテキスト文字列ではないのでしょうか?ここでループが最初のページに貼り付けた

は、私が持っているものです。

import csv 
import urllib2 
from bs4 import BeautifulSoup 

f = open('nhlstats.csv', "w") 


groups=['points', 'shooting', 'goaltending', 'defensive', 'timeonice', 'faceoffs', 'minor-penalties', 'major-penalties'] 

year = ["2016", "2015","2014","2013","2012"] 

for yr in year: 
    for gr in groups: 
     url = "http://www.espn.com/nhl/statistics/player/_/stat/points/year/"+str(yr) 
    #www.espn.com/nhl/statistics/player/_/stat/points/year/2014/ 
    page = urllib2.urlopen(url) 
    soup=BeautifulSoup(page, "html.parser") 
    pagecount = soup.findAll(attrs= {"class":"page-numbers"})[0].string 
    pageliteral = int(pagecount[5:]) 
    for i in range(0,pageliteral): 
     number = int(((i*40) + 1)) 
     URL = "http://www.espn.com/nhl/statistics/player/_/stat/points/sort/points/year/"+str(yr) + "/count/"+str(number) 
     page = urllib2.urlopen(url) 
     soup=BeautifulSoup(page, "html.parser") 
     for tr in soup.select("#my-players-table tr[class*=player]"): 
      row =[] 
      for ob in range(1,15): 
       player_info = tr('td')[ob].get_text(strip=True) 
       row.append(player_info) 
      f.write(str(yr) +","+",".join(row) + "\n") 

f.close() 

これは何度も同じ最初の40件のレコードを取得します。

は私がいるかのように this solutionを使用してみましたし、

prevLink = soup.select('a[rel="nofollow"]')[0] 
newurl = "http:" + prevLink.get('href') 

を行うことは良い仕事でしたことがわかりましたが、私はそれが前進するような方法でループを行う方法がわからないんだけど?おそらく疲れているかもしれませんが、私のループはまだレコードの次のセットに行き、につきました。それはです。私は

私のループを解決する助けてください、私のフォーマットは、コピーペーストで失われたUPDATE

、私の実際のコードは次のようになります。あなたが開いている前に、URLを何度も変更されている

import csv 
import urllib2 
from bs4 import BeautifulSoup 

f = open('nhlstats.csv', "w") 


groups=['points', 'shooting', 'goaltending', 'defensive', 'timeonice', 'faceoffs', 'minor-penalties', 'major-penalties'] 

year = ["2016", "2015","2014","2013","2012"] 


for yr in year: 
    for gr in groups: 
     url = "http://www.espn.com/nhl/statistics/player/_/stat/points/year/"+str(yr) 
    #www.espn.com/nhl/statistics/player/_/stat/points/year/2014/ 
     page = urllib2.urlopen(url) 
     soup=BeautifulSoup(page, "html.parser") 
     pagecount = soup.findAll(attrs= {"class":"page-numbers"})[0].string 
     pageliteral = int(pagecount[5:]) 
     for i in range(0,pageliteral): 
      number = int(((i*40) + 1)) 
      URL = "http://www.espn.com/nhl/statistics/player/_/stat/points/sort/points/year/"+str(yr) + "/count/"+str(number) 
      page = urllib2.urlopen(url) 
      soup=BeautifulSoup(page, "html.parser") 
      for tr in soup.select("#my-players-table tr[class*=player]"): 
       row =[] 
       for ob in range(1,15): 
        player_info = tr('td')[ob].get_text(strip=True) 
        row.append(player_info) 
       f.write(str(yr) +","+",".join(row) + "\n") 

f.close() 
+0

私はあなたがすべてで最初のページを取得する方法を見ることができません。それはあなたのコードがどのように見えるのでしょうか? –

+0

人々がコメントしているインデントエラーは、実際には私のコピーの貼り付けから、stackoverflowへの書式設定が失われています...実際の書式設定で更新しています。 – ike

答えて

1

あなたのコードのインデントはほとんど故障していました。また、実際にインポートしたCSVライブラリを使用することが賢明でしょう。これは、内部でコンマが使用されないように、プレーヤー名を自動的に引用符で囲みます。

これは、次のページへのリンクを探して開始カウントを抽出することによって機能します。これはあなたの次のページを構築するために使用されます。次のページが見つからない場合は、次の年のグループに移動します。カウントはページカウントではなく、開始エントリカウントであることに注意してください。

import csv 
import urllib2 
from bs4 import BeautifulSoup 


groups= ['points', 'shooting', 'goaltending', 'defensive', 'timeonice', 'faceoffs', 'minor-penalties', 'major-penalties'] 
year = ["2016", "2015", "2014", "2013", "2012"] 

with open('nhlstats.csv', "wb") as f_output: 
    csv_output = csv.writer(f_output) 

    for yr in year: 
     for gr in groups: 
      start_count = 1 
      while True: 
       #print "{}, {}, {}".format(yr, gr, start_count)  # show progress 

       url = "http://www.espn.com/nhl/statistics/player/_/stat/points/sort/points/year/{}/count/{}".format(yr, start_count) 
       page = urllib2.urlopen(url) 
       soup = BeautifulSoup(page, "html.parser") 

       for tr in soup.select("#my-players-table tr[class*=player]"): 
        row = [yr] 
        for ob in range(1, 15): 
         player_info = tr('td')[ob].get_text(strip=True) 
         row.append(player_info) 

        csv_output.writerow(row) 

       try: 
        start_count = int(soup.find(attrs= {"class":"page-numbers"}).find_next('a')['href'].rsplit('/', 1)[1]) 
       except: 
        break 

withを使用すると、自動的にファイルが自動的に閉じられます。

この次のように開始するあなたのcsvファイルを与えるだろう:

2016,"Patrick Kane, RW",CHI,82,46,60,106,17,30,1.29,287,16.0,9,17,20 
2016,"Jamie Benn, LW",DAL,82,41,48,89,7,64,1.09,247,16.6,5,17,13 
2016,"Sidney Crosby, C",PIT,80,36,49,85,19,42,1.06,248,14.5,9,10,14 
2016,"Joe Thornton, C",SJ,82,19,63,82,25,54,1.00,121,15.7,6,8,21 
+0

に再投稿されました。 1)ポイントがカラム間で一貫していないため、ソートカラムの変数に追加しました。 2)変数ごとにraw_inputを実行することになりました。それ以外の場合は、各キーペアの各項目をループします。これにはゴールキーパーを投げないという副次的なメリットもありました。 マイナーノート: 1)ページジャンプの仕組みを説明できますか?彼らは完璧で興味があったので、私は学ぶことができました。 2)実際に名前を引用しないようにしたいので、一度CSVを開くと、コンマで区切られ、位置の列が作成されます。それをオフにする方法はありますか? – ike

+1

サイトは '1 of 20'と表示されますが、必要なURLは数です。したがって、50のエントリが1ページ目にあった場合、2ページ目は51のURLで始まります。このコードは、 'page-numbers'クラスの次のurlでこれを探します。理論的には、URLコード全体が代わりに使用されます。 –

+1

csvエントリを引用符で囲まないと、可変数の列が存在するため、Excelなどで開くとデータが正しく整列しません。引用符を無効にするには、 'quoting = csv.QUOTE_NONE、escapechar = ''、quotechar = '''をライターのパラメータに追加することができます。それは非常に困難でファイルを読み返すことになります。 'csv.reader()'はあなたがそれを読み込んだ場合に自動的に引用符を解析して削除します。 –

0

インデントエラーのために初めてです。これを試してみてください:

for gr in groups: url = "...some_url..." page = urllib2.urlopen(url) ...everything else should be indented....

+0

クイック返信をしてくれてありがとうございます。残念なことに、コピー/貼り付けエラーです。実際のコードは – ike

関連する問題