我现在正在使用Python 3.5和bs4构建一个Web抓取程序。在下面的代码中,我试图从url中的两个表中检索数据。我在第一个表中成功,但是第二个表弹出错误。错误是" IndexError:列表索引超出范围" for" D.append(cells [0] .find(text = True))"。我检查了" cells'的列表索引,它给了我0,1,2,所以应该没问题。有人能提出任何解决这个问题的想法吗?
import tkinter as tk
def test():
from bs4 import BeautifulSoup
import urllib.request
import pandas as pd
url_text = 'http://www.sce.hkbu.edu.hk/future-students/part-time/short-courses-regular.php?code=EGE1201'
resp = urllib.request.urlopen(url_text)
soup = BeautifulSoup(resp, from_encoding=resp.info().get_param('charset'))
all_tables=soup.find_all('table')
print (all_tables)
right_table=soup.find('table', {'class' : 'info'})
A=[]
B=[]
C=[]
for row in right_table.findAll("tr"):
cells = row.findAll('td')
A.append(cells[0].find(text=True))
B.append(cells[1].find(text=True))
C.append(cells[2].find(text=True))
df=pd.DataFrame()
df[""]=A
df["EGE1201"]=C
print(df)
D=[]
E=[]
F=[]
right_table=soup.find('table', {'class' : 'schedule'})
for row in right_table.findAll("tr"):
try:
cells = row.findAll('th')
except:
cells = row.findAll('td')
D.append(cells[0].find(text=True))
E.append(cells[1].find(text=True))
F.append(cells[2].find(text=True))
df1=pd.DataFrame()
df[D[0]]=D[1]
df[E[0]]=E[1]
df[F[0]]=F[1]
print(df1)
if __name__ == '__main__':
test()
答案 0 :(得分:1)
看起来你期望这段代码在'th'和'td'之间进行选择,但它不会。它将始终选择'th',并且当该行中没有'th'时将返回一个空列表。
try:
cells = row.findAll('th')
except:
cells = row.findAll('td')
相反,我会更改代码以检查列表是否为空,然后请求'td':
cells = row.findAll('th')
if not cells:
cells = row.findAll('td')
或者,您可以将代码缩短为:
cells = row.findAll('th') or row.findAll('td')