2016-12-09 1 views
1

웹 페이지에서 데이터를 추출하려고하는데 위 오류가 계속 발생합니다. 나는이 사이트의 예제뿐만 아니라 다른 것을 보았지만 문제는 직접적으로 다루지 않았다.AttributeError : 'ResultSet'객체에 'find_all'속성이 없습니다. - pd.read_html

from bs4 import BeautifulSoup 

import requests 

import pandas as pd 

url = 'http://www.espn.com/nhl/statistics/player/_/stat/points/sort/points/year/2015/seasontype/2' 

r = requests.get(url) 

data = r.text 

soup = BeautifulSoup(data, "lxml") 

table = soup.find_all('table', class_='dataframe') 

rows = table.find_all('tr')[2:] 

data = { 
    'RK' : [], 
    'PLAYER' : [], 
    'TEAM' : [], 
    'GP' : [], 
    'G' : [], 
    'A' : [], 
    'PTS' : [], 
    '+/-' : [], 
    'PIM' : [], 
    'PTS/G' : [], 
    'SOG' : [], 
    'PCT' : [], 
    'GWG' : [], 
    'G1' : [], 
    'A1' : [], 
    'G2' : [], 
    'A2' : [] 
} 

for row in rows: 
    cols = row.find_all('td') 
    data['RK'].append(cols[0].get_text()) 
    data['PLAYER'].append(cols[1].get_text()) 
    data['TEAM'].append(cols[2].get_text()) 
    data['GP'].append(cols[3].get_text()) 
    data['G'].append(cols[4].get_text()) 
    data['A'].append(cols[5].get_text()) 
    data['PTS'].append(cols[6].get_text()) 
    data['+/-'].append(cols[7].get_text()) 
    data['PIM'].append(cols[8].get_text()) 
    data['PTS/G'].append(cols[9].get_text()) 
    data['SOG'].append(cols[10].get_text()) 
    data['PCT'].append(cols[11].get_text()) 
    data['GWG'].append(cols[12].get_text()) 
    data['G1'].append(cols[13].get_text()) 
    data['A1'].append(cols[14].get_text()) 
    data['G2'].append(cols[15].get_text()) 
    data['A2'].append(cols[16].get_text()) 

df = pd.DataFrame(data) 

df.to_csv("NHL_Players_Stats.csv") 

나는 오류가 테이블에 (즉, 결과 집합) 메소드 find_all을 가지고 있지를 언급했다 및 코드는 다음 줄을 주석에 의해 실행되었다 있음을 확인하여 오류를 근절 한 아래 코드를 참조하십시오 :

#rows = table.find_all('tr')[2:] 

이 변경

는 :

for row in rows: 

이, 그러나 웹 페이지에서 데이터를 추출하지 않고 단순히 열 헤더와 .csv 파일을 만듭니다.

soup.find_all을 사용하여 일부 데이터를 행에 직접 추출하려고 시도했지만 다음 오류가 발생합니다.

data['GP'].append(cols[3].get_text()) 
IndexError: list index out of range 

나는 해결할 수 없었습니다.

따라서 모든 도움을 주시면 감사하겠습니다. 나 또한이 시도했기 때문에

dataframe = pd.read_html('url') 

하지만 유지 유지 : 이것이 이상적으로

FeatureNotFound: Couldn't find a tree builder with the features you 
requested: html5lib. Do you need to install a parser library? 

또한, 호기심, 사용하여 원하는 결과를 달성하기 위해 어떤 방법이있다 방법을 선호하지만, 온라인으로 예제를 찾을 수 없습니다.

+0

[html5lib] (https://pypi.python.org/pypi/html5lib)를 찾을 수 없습니까? 글쎄, 나중에 가자. – TemporalWolf

+0

@TemporalWolf, 맞아. 그러나, BeautifulSoup() 메서드로 사용할 때 찾은 것 같습니다. 어떤 제안? :) – aLoHa

답변

0

find_all은 기본적으로 요소 목록 인 ResultSet을 반환합니다. 이러한 이유로 개별 요소에 속하는 메서드 인 find_all 메서드가 없습니다.

표가 하나만 필요한 경우 find_all 대신 find을 사용하십시오.

table = soup.find('table', class_='dataframe') 

그런 작업을해야 그 행을 받고 이미했던 것처럼 :

rows = table.find_all('tr')[2:] 

당신이있어 두 번째 오류가 있기 때문에 어떤 이유로, 테이블의 행 중 하나는 3 세포를 갖고있는 것 같아요 따라서 cols 변수는 0, 1 및 2 색인 만있는 목록이되었습니다. 따라서 cols[3]IndexError입니다. 사용하여 동일한 결과를 달성하는 관점에서

+0

의견에 감사드립니다. 나는 당신의 제안을 시도했지만, 두 번째 줄 : rows = table.find_all은 여전히 ​​첫 번째 줄이 table = soup.find (.....)로 바뀌더라도 그 오류를 던지고있다. 두 번째 오류와 관련해서는 말이되는 것 같습니다. 그러므로 행 (0)이 아닌 행 (1)에서 추출을 시작하면 문제가 발생하는 것이 더 낫겠습니까? – aLoHa

0

: 그것은 단지 또는 유사하여 달성된다 dataframe를 = pd.read_html ('URL')

: dataframe = pd.read_html (URL 헤더 = 1, index_col = None)

내가 이전에 오류를받은 이유는 Spyder의 iPython 콘솔의 백엔드를 '환경 설정'에서 '자동'으로 구성하지 않았기 때문입니다.

그러나 BeautifulSoup를 사용하여이 문제를 해결하려고합니다. 따라서 유용한 의견을 보내 주시면 감사하겠습니다.

관련 문제