TypeError: 'DataFrame' object is not callable
Написала код для сбора информации с сайта, обернула его в функцию:
def Table1(u):
#////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# table 1 CA ---------------------------------------------------------------------------------------------------------------------------------
# C - Chairman / M - Members
# A - actual / H - historical
Date = driver.find_element_by_xpath(DateLinls.iloc[u,0])
trsCA = driver.find_elements_by_xpath('//div/table/tbody/tr[1]/td/div/table/tbody/tr[2]/td/div/table/tbody/tr') # used for Person name PN and previous jobs PJ
aCA = "//div/table/tbody/tr[1]/td/div/table/tbody/tr[2]/td/div/table/tbody/tr[" # used for Person name PN and previous jobs PJ
# Person name variable +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bCAPN = "]/td[1]/div/a"
PNCAl1 = []
for i in range(1,len(trsCA)+1):
result = aCA + str(i) + bCAPN
PNCAr = driver.find_element_by_xpath(result)
PNCAl1.append(PNCAr.text)
PNCA = pd.DataFrame(PNCAl1)
#print(PNCA)
# Title ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CATr = driver.find_element_by_xpath('//div/table/tbody/tr[1]/td/div/table/tbody/tr[1]/td/h3')
# Year of birth +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bCAY = ']/td[1]/div/div[1]'
CAYl = []
for i in range(1,len(trsCA)+1):
result = aCA + str(i) + bCAY
CAYr = driver.find_element_by_xpath(result)
CAYl.append(CAYr.text)
CAY = pd.DataFrame(CAYl)
# Education +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
bCAE = ']/td[1]/div/div[2]'
CAEl = []
for i in range(1,len(trsCA)+1):
result = aCA + str(i) + bCAE
CAEr = driver.find_element_by_xpath(result)
CAEl.append(CAEr.text)
CAE = pd.DataFrame(CAEl)
# Previous Jobs and MAIN CODE =================================================================================================================
bPJ = ']/td[3]/div'
PJCAl =[]
for i in range(1,len(trsCA)+1):
result = aCA + str(i) + bPJ
PJCAl.append(result)
PJCA = pd.DataFrame(PJCAl)
PJCAl = []
PNCAl = []
DPl = []
CAJl = [] # JOBS
for i in range(0,len(trsCA)):
trsPJCA1 = driver.find_elements_by_xpath(PJCA.iloc[i,0]) # this is a number of div
DPl.append(len(trsPJCA1))
DP = pd.DataFrame(DPl)
NumbersOfNamesCA = numpy.array(DP.iloc[:,0])
a3 = str(PJCA.iloc[i,0]) #this is begining of link
for j in range(1,len(trsPJCA1)+1): # continue taking previous jobs WORKS
bCAJ1 = ']'
bCAJ2 = '['
result = a3 + bCAJ2 + str(j) + bCAJ1
CAJr = driver.find_element_by_xpath(result)
print(CAJr.text)
CAJl.append(CAJr.text)
CAJF = pd.DataFrame(CAJl)
# code which print/take names depends on how many time they need to be printed WORKS
PNCAl1 = [] # NAME
for g in range(0,len(trsCA)):
a = int(g)
for k in range(0,NumbersOfNamesCA[a]):
if NumbersOfNamesCA[a] == 0:
PNCAl1.append("-")
PNCAF = pd.DataFrame(PNCAl1)
else:
PNCAl1.append(PNCA.iloc[g,0])
PNCAF = pd.DataFrame(PNCAl1)
CAYl1 = [] # YER OF BIRTH
for g in range(0,len(trsCA)):
a = int(g)
for k in range(0,NumbersOfNamesCA[a]):
if NumbersOfNamesCA[a] == 0:
CAYl1.append("-")
CAYF = pd.DataFrame(CAYl1)
else:
CAYl1.append(CAY.iloc[g,0])
CAYF = pd.DataFrame(CAYl1)
CAEl1 = [] # EDUCATION
for g in range(0,len(trsCA)):
a = int(g)
for k in range(0,NumbersOfNamesCA[a]):
if NumbersOfNamesCA[a] == 0:
CAEl1.append("-")
CAEF = pd.DataFrame(CAEl1)
else:
CAEl1.append(CAE.iloc[g,0])
CAEF = pd.DataFrame(CAEl1)
CATl = [] # Title
for i in range(0,len(CAJF)):
CATl.append(CATr.text)
CAT = pd.DataFrame(CATl)
CADl = [] # Date
for i in range(0,len(CAJF)):
CADl.append(Date.text)
CAD = pd.DataFrame(CADl)
CAIDl = [] # ID
for i in range(0,len(CAJF)):
CAIDl.append(IDd.iloc[u,0]) # 3 ingecates position of INN from Dataframe which we've created before in mine loop should be replased by i/j/wharever
CAIDf = pd.DataFrame(CAIDl)
# concat to 1st table Database
#FirstTable = pd.DataFrame(columns=(['ID', 'Title', 'Date', 'Name', 'YearOfBirth', 'Education', 'Jobs']))
FirstTable = pd.concat([CAIDf, CAT, CAD, PNCAF, CAYF, CAEF, CAJF], axis=1)
return FirstTable
Таких функций несколько. Хочу поместить их в цикл for, чтобы пройтись по списку страниц сайта.
Пока для теста это выглядит так:
if __name__ == '__main__':
u = 1
driver.get(MyLinks.iloc[u,0])
Table1 = Table1(u)
#Table2 = Table2(u)
#Table3 = Table3(u)
#Table4 = Table4(u)
Проблема в том, что когда выделяю просто строку, например Table1 = Table1(u) и нажимаю F9, все прекрасно работает. Но когда выделяю весь код, выдает ошибку TypeError: 'DataFrame' object is not callable .
Пробовала использовать return(FirstTable) вместо return FirstTable все равно не работает.
The error traceback
Выдает следующее:
Traceback (most recent call last):
File "<ipython-input-10-844b48fac0c3>", line 5, in <module>
Table2 = Table2(u)
Ответы (1 шт):
Стиль, в котором вы используете функции позволяет вызывать их не более одного раза.
После вызова:
func_name = func_name(...)
Объект func_name указывает на то, что вернула функция. Если функция вернула объект типа pandas.DataFrame, то при повторном вызове функции func_name() вы уже пытаетесь использовать объект типа pandas.DataFrame как функцию, о чем вам сообщают в сообщении об ошибке.
Не перезаписывайте имена функций и у вас не будет подобных проблем!