2016-10-03 3 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

다음과 같이

이 시작하는 당신에게 csv 파일을 줄 것이다. 정확히 코드가 어떻게 보이나요? –

+0

여러분의 의견을 들여 쓰는 들여 쓰기 오류는 실제로 내 복사본에서 stackoverflow로 붙여 넣기의 서식을 잃어 버렸습니다 ... 실제 서식으로 업데이트 중입니다. – ike

답변

1

귀하의 코드 들여 쓰기는 대부분 잘못이었다. 또한 가져온 CSV 라이브러리를 실제로 사용하는 것이 현명합니다. 그러면 CSV 구조를 망칠 수있는 쉼표가 없도록 플레이어 이름을 따옴표로 자동 줄 바꿈합니다.

다음 페이지로 연결되는 링크를 찾고 시작 카운트를 추출하면됩니다. 이것은 다음 페이지를 구축하는 데 사용됩니다. 다음 페이지를 찾을 수 없으면 다음 연도 그룹으로 이동합니다. 카운트는 페이지 수가 아니라 시작 항목 수입니다. 자동 끝에 파일을 닫습니다 with를 사용

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 

. 당신이 모든 첫 번째 페이지를 얼마나 내가 볼 수없는

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) 포인트가 컬럼간에 일관 적이 지 않았기 때문에 sort 컬럼을위한 변수에 추가했다. 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 = '''을 인용문을 사용하지 못하게하려면 writer 매개 변수에 추가 할 수 있습니다. 그것은 매우 어려운 파일을 다시 읽게 만들 것입니다. 'csv.reader()'는 다시 읽으면 인용문을 자동으로 구문 분석하고 제거합니다. –

0

들여 쓰기 오류로 인해 처음. 이 시도 :

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

+0

답장을 보내 주셔서 감사합니다. 유감 스럽지만 복사/붙여 넣기 오류입니다. 실제 코드는 – ike

관련 문제