import requests,csv,random,bs4
csv_file= open('C:\\Users\\ke\\Desktop\\电影排名250.csv','w',newline= '')
newline = ''
writer = csv.writer(csv_file)
writer.writerow(['序号','电影名','评分','推荐语','链接'])
for x in range(10):
url = 'https://movie.douban.com/top250?start=' + str(x*25) + '&filter='
res = requests.get(url)
bs = bs4.BeautifulSoup(res.text,'html.parser')
bs = bs.find('ol',class_ = 'grid_view')
for titles in bs.find_all('li'):
num = titles.find('em',class_ = '').text
title = titles.find('span',class_ = 'title').text
comment = titles.find('span',class_ = 'rating_num').text
url_movie = titles.find('a')['herf']
if titles.find('span',class_ = 'inq') !=None:
tes = titles.find('span',class_ = 'inq').text
writer.writerow([num + '.' + title + '——' + comment + '\n' + '推荐语:' + tes +'\n' + url_movie])
else:
writer.writerow([num + '.' + title + '——' + comment + '\n' +'\n' + url_movie])
csv_file.close()
一直提示AttributeError: 'NoneType' object has no attribute 'find_all'真没找出来哪里错了
代码中主要有两个问题:
一是请求没有写请求头headers,没有获取到页面代码,值为None,因此后面用find或findall会报错。
二是url_movie的节点元素获取需要改写一下。否则也为None
解决办法:
1.在第9行requests.get()中添加:headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0'}
2.将16行改成:url_movie = titles.find('div',class_='hd').find_next('a')['href']
如有帮助,请点击采纳。
学编程先学调试
很明显错误原因在于 bs = bs.find('ol',class_ = 'grid_view')这句代码执行之后,bs变成None了
那么它为什么会变成None,又需要你一步一步往回追溯
关键是遇到问题要先理清脉络,不要纠结于诸如“为什么”这类问题,要先找到到底是哪一步开始就跟你设想的结果不一样了。
ps:调试方法很多,你可以单步调试,一步一步跟踪,看每一步的结果是否符合预期;也可以设置断点,只看关键步骤,再根据结果修改断点的位置;也可以直接写个print打印出过程,看程序是否是按你预设的方式执行的