2016-12-23 12 views
0

最近私は自分自身でウェブスクレイピングを教えてきました。私は自分のコードをモジュラー化しようとするとエラーが発生しました。私は元のプログラムのメソッドを使用する新しいプログラムを書くためにしようとしているリストオブジェクトが呼び出せない、エラーが見つかりません

File "ValueScraper.py", line 16, in <module> 
table = ts.lol_table(soup) 
TypeError: 'list' object is not callable 

、これは失敗している理由を把握することはできません:私はのエラーを取得しています。ここでは、すべてのメソッドを持つ古いプログラムがあります:

from bs4 import BeautifulSoup 
from urllib2 import urlopen 
import csv 
import pandas 
import TableScraper as ts 

#url of table with values 
url = "http://www.rotowire.com/daily/NBA/optimizer.php?site=FanDuel" 

#columns for table 
columns = ["Player", "Value"] 

#make soup of url 
soup = ts.make_soup(url) 

table = ts.lol_table(soup) 

任意の助けをいただければ幸いです。

from bs4 import BeautifulSoup 
from urllib2 import urlopen 
import csv 
import pandas 

#url of Basketball Reference page 
url = "http://www.basketball-reference.com/leagues/NBA_2017_totals.html" 

#set columns for pandas dataframe 
header = ["Player", "Pos", "Age", "Tm", "G", "GS", "MP", "FG", "FGA", "FG%", "3P", "3PA", "3P%", "2P", "2PA", "2P%", "eFG%", "FT", "FTA", "FT%", "ORB", "DRB", "TRB", "AST", "STL", "BLK", "TOV", "PF", "PTS"] 

#open url and turn to BS object 
def make_soup(url): 
    html = urlopen(url).read() 
    soup = BeautifulSoup(html, "lxml") 
    return soup 


#returns list of lists (lol_table) of html table 
def lol_table(soup, class_name = ""): 
    rows = [] 
    if class_name is "": 
     rows = soup.find_all('tr') 
    else: 
     rows = soup.find_all('tr', class_ = class_name) 
    data = [] 
    for row in rows: 
     cols = row.find_all('td') 
     data_row = [] 
     for col in cols: 
      data_row.append(col.find(text=True)) 
     data.append(data_row) 
    return data 


#create pandas dataframe from lol_table and create csv of it 
def to_pandas_csv(lol_table): 
    df = pandas.DataFrame(lol_table, columns=header) 
    df.to_csv("nba.csv") 
    return df 

soup = make_soup(url) 
lol_table = lol_table(soup, "full_table") 
data_frame = to_pandas_csv(lol_table) 

そして、ここでは、新しいファイルがあります。

答えて

4
lol_table = lol_table(soup, "full_table") 

呼び出しの結果にその関数の名前を再バインドしないでください。 Pythonでは、関数オブジェクトの名前と関数オブジェクト以外のオブジェクトの名前は区別されません。そのスコープ内にその名前のオブジェクトが1つしか存在せず、最新のバインディングが優先されます。別の名前を選択してください。

result = lol_table(soup, "full_table") 
関連する問題