2016-12-09 2 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") 

Я ликвидировала ошибку, видя, что ошибка обращения к таблице (т.е. Resultset) не имеющий метод 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 вместо find_all, чтобы его найти.

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

Затем, получив ее строки должны работать, как вы уже сделали:

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

Вторая ошибка, которую вы получили, потому что, по некоторым причинам, одна из строк таблицы, кажется, есть только три ячейки , таким образом, ваша переменная cols стала списком только с индексами 0, 1 и 2. Вот почему cols[3] дает вам IndexError.

+0

благодарит за комментарии. Я попробовал ваше предложение, но вторая строка: rows = table.find_all все еще бросает эту ошибку, даже когда первая строка изменена на table = soup.find (.....). Что касается второй ошибки, которая, как представляется, имеет смысл. Было бы лучше, если бы я начал извлечение из строки (1), а не строки (0), что и вызывает проблему? – aLoHa

0

С точки зрения достижения того же результата с помощью: dataframe = pd.read_html ('URL')

Это достигается с помощью только что либо подобное: dataframe = pd.read_html (URL, заголовок = 1, index_col = None)

Причина, по которой я получал ранее ошибки, заключается в том, что я не сконфигурировал серверную консоль Spyder iPython для «автоматического» в «Предпочтениях».

Я все еще пытаюсь решить эту проблему с помощью BeautifulSoup. Поэтому любые полезные комментарии будут оценены.

Смежные вопросы