鱼C论坛

 找回密码
 立即注册
查看: 2329|回复: 16

[已解决]极客Python爬起豆瓣出现list index out of range错误怎么办

[复制链接]
发表于 2021-2-3 17:03:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
代码基本上照抄的小甲鱼的。最后运行出现list index out of range错误怎么解决啊
有没有大佬有现在可运行的完整代码发一下啊
import requests
import bs4
import re

def open_url(url):
        headers={'user-agent':'Mozilla/5.0'}
        res=requests.get(url,headers=headers)
        return res

def find_movies(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")

    movies=[]
    targets=soup.find_all("div",class_="hd")
    for each in targets:
        movies.append(each.a.span.text)

    ranks=[]
    targets=soup.find_all("span",class_="rating_num")
    for each in targets:
        ranks.append(' 评分:%s ' % each.text)

    messages=[]
    targets=soup.find_all("div",class_="bd")
    for each in targets:
        try:
            messages.append(each.p.text.split("\n")[1],strip()+each.p.text.split("\n")[2].strip())
        except:
            continue

    result=[]
    length=len(movies)
    for i in range(length):
        result.append(movies[i]+ranks[i]+messages[i]+"\n")

    return result

def find_depth(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")
    depth=soup.find("span",class_="next").previous_sibling.previous_sibling.text

    return int(depth)

def main():
    host="https://movie.douban.com/top250"
    res=open_url(host)
    depth=find_depth(res)

    result=[]
    for i in range(depth):
        url=host+"/?start=" + str(25 * i)
        res=open_url(url)
        result.extend(find_movies(res))

    with open("豆瓣TOP250电影.txt","w",encoding="utf-8") as f:
        for each in result:
            f.write(each)

if __name__=="__main__":
    main()
最佳答案
2021-2-3 18:38:24
代码第27句。写错了。
这一句。messages.append(each.p.text.split("\n")[1]后面是'.strip()',写成了逗号
messages.append(each.p.text.split("\n")[1],strip()+each.p.text.split("\n")[2].strip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-3 17:26:47 | 显示全部楼层
headers={'user-agent':'Mozilla/5.0'}
这个写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-2-3 18:38:24 | 显示全部楼层    本楼为最佳答案   
代码第27句。写错了。
这一句。messages.append(each.p.text.split("\n")[1]后面是'.strip()',写成了逗号
messages.append(each.p.text.split("\n")[1],strip()+each.p.text.split("\n")[2].strip())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-2-3 19:14:48 | 显示全部楼层

好的 已修改,但运行没反应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 19:15:18 | 显示全部楼层
YunGuo 发表于 2021-2-3 18:38
代码第27句。写错了。
这一句。messages.append(each.p.text.split("\n")[1]后面是'.strip()',写成了逗号 ...

感谢,已修改,但运行没反应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 19:16:15 | 显示全部楼层
报错信息贴出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 19:19:31 | 显示全部楼层
修改后的代码
原先有部分手打的出错了
现在应该跟小甲鱼的一样了
但运行是没反应。。。。
import requests
import bs4
import re

def open_url(url):
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
        res=requests.get(url,headers=headers)
        return res

def find_movies(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")

    movies=[]
    targets=soup.find_all("div",class_="hd")
    for each in targets:
        movies.append(each.a.span.text)

    ranks=[]
    targets=soup.find_all("span",class_="rating_num")
    for each in targets:
        ranks.append(' 评分:%s ' % each.text)

    messages=[]
    targets=soup.find_all("div",class_="bd")
    for each in targets:
        try:
            messages.append(each.p.text.split("\n")[1].strip()+each.p.text.split("\n")[2].strip())
        except:
            continue

    result=[]
    length=len(movies)
    for i in range(length):
        result.append(movies[i]+ranks[i]+messages[i]+"\n")
    return result

def find_depth(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")
    depth=soup.find("span",class_="next").previous_sibling.previous_sibling.text

    return int(depth)

def main():
    host="https://movie.douban.com/top250"
    res=open_url(host)
    depth=find_depth(res)

    result=[]
    for i in range(depth):
        url=host+"/?start=" + str(25 * i)
        res=open_url(url)
        result.extend(find_movies(res))

    with open("豆瓣TOP250电影.txt","w",encoding="utf-8") as f:
        for each in result:
            f.write(each)

if __name__=="__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 19:20:13 | 显示全部楼层

不报错  就是没反应了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-3 19:22:13 | 显示全部楼层
没反应要么就是没有爬到东西,要么就是你没看到那个生成的文件

你挨个 print 一下,找找问题呗

能 print 的都 print 一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 19:23:17 | 显示全部楼层
Daniel_Zhang 发表于 2021-2-3 19:22
没反应要么就是没有爬到东西,要么就是你没看到那个生成的文件

你挨个 print 一下,找找问题呗

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 19:59:46 | 显示全部楼层
爬虫成功了 感谢大家
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 09:55:23 | 显示全部楼层
DSSIMP 发表于 2021-2-3 19:59
爬虫成功了 感谢大家

能不能分享下完全体的代码呀  小白路过 还在基础语法趴着 好难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-20 14:04:38 | 显示全部楼层
手里尖刀刺 发表于 2021-8-20 09:55
能不能分享下完全体的代码呀  小白路过 还在基础语法趴着 好难

import requests
import bs4
import re

def open_url(url):
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
        res=requests.get(url,headers=headers)
        return res

def find_movies(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")

    movies=[]
    targets=soup.find_all("div",class_="hd")
    for each in targets:
        movies.append(each.a.span.text)

    ranks=[]
    targets=soup.find_all("span",class_="rating_num")
    for each in targets:
        ranks.append(' 评分:%s ' % each.text)

    messages=[]
    targets=soup.find_all("div",class_="bd")
    for each in targets:
        try:
            messages.append(each.p.text.split("\n")[1].strip()+each.p.text.split("\n")[2].strip())
        except:
            continue

    n=len(messages)
    for i in range(n):
        messages[i]=messages[i].replace("\xa0"," ")

    result=[]
    length=len(movies)
    for i in range(length):
        result.append(movies[i]+ranks[i]+messages[i].replace("\xa0"," ")+"\n")
    return result

def find_depth(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")
    depth=soup.find("span",class_="next").previous_sibling.previous_sibling.text

    return int(depth)

def main():
    host="https://movie.douban.com/top250"
    res=open_url(host)
    depth=find_depth(res)

    result=[]
    for i in range(depth):
        url=host+"/?start=" + str(25 * i)
        res=open_url(url)
        result.extend(find_movies(res))

    with open("豆瓣TOP250电影.txt","w",encoding="utf-8") as f:
        for each in result:
            f.write(each)

if __name__=="__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-20 14:05:44 | 显示全部楼层
DSSIMP 发表于 2021-8-20 14:04
import requests
import bs4
import re
import requests
import bs4
import re

def open_url(url):
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
        res=requests.get(url,headers=headers)
        return res

def find_movies(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")

    movies=[]
    targets=soup.find_all("div",class_="hd")
    for each in targets:
        movies.append(each.a.span.text)

    ranks=[]
    targets=soup.find_all("span",class_="rating_num")
    for each in targets:
        ranks.append(' 评分:%s ' % each.text)

    messages=[]
    targets=soup.find_all("div",class_="bd")
    for each in targets:
        try:
            messages.append(each.p.text.split("\n")[1].strip()+each.p.text.split("\n")[2].strip())
        except:
            continue

    n=len(messages)
    for i in range(n):
        messages[i]=messages[i].replace("\xa0"," ") 

    result=[]
    length=len(movies)
    for i in range(length):
        result.append(movies[i]+ranks[i]+messages[i].replace("\xa0"," ")+"\n")
    return result

def find_depth(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")
    depth=soup.find("span",class_="next").previous_sibling.previous_sibling.text

    return int(depth)

def main():
    host="https://movie.douban.com/top250"
    res=open_url(host)
    depth=find_depth(res)

    result=[]
    for i in range(depth):
        url=host+"/?start=" + str(25 * i)
        res=open_url(url)
        result.extend(find_movies(res))

    with open("豆瓣TOP250电影.txt","w",encoding="utf-8") as f:
        for each in result:
            f.write(each)

if __name__=="__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-20 14:07:22 | 显示全部楼层
手里尖刀刺 发表于 2021-8-20 09:55
能不能分享下完全体的代码呀  小白路过 还在基础语法趴着 好难
import requests
import bs4
import re

def open_url(url):
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36'}
        res=requests.get(url,headers=headers)
        return res

def find_movies(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")

    movies=[]
    targets=soup.find_all("div",class_="hd")
    for each in targets:
        movies.append(each.a.span.text)

    ranks=[]
    targets=soup.find_all("span",class_="rating_num")
    for each in targets:
        ranks.append(' 评分:%s ' % each.text)

    messages=[]
    targets=soup.find_all("div",class_="bd")
    for each in targets:
        try:
            messages.append(each.p.text.split("\n")[1].strip()+each.p.text.split("\n")[2].strip())
        except:
            continue

    n=len(messages)
    for i in range(n):
        messages[i]=messages[i].replace("\xa0"," ") 

    result=[]
    length=len(movies)
    for i in range(length):
        result.append(movies[i]+ranks[i]+messages[i].replace("\xa0"," ")+"\n")
    return result

def find_depth(res):
    soup=bs4.BeautifulSoup(res.text,"html.parser")
    depth=soup.find("span",class_="next").previous_sibling.previous_sibling.text

    return int(depth)

def main():
    host="https://movie.douban.com/top250"
    res=open_url(host)
    depth=find_depth(res)

    result=[]
    for i in range(depth):
        url=host+"/?start=" + str(25 * i)
        res=open_url(url)
        result.extend(find_movies(res))

    with open("豆瓣TOP250电影.txt","w",encoding="utf-8") as f:
        for each in result:
            f.write(each)

if __name__=="__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-20 16:14:07 | 显示全部楼层
C:\Users\gt20180105\Desktop这是什么情况啊 请求无效
1629447177(1).jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-2 16:38:55 | 显示全部楼层
手里尖刀刺 发表于 2021-8-20 16:14
这是什么情况啊 请求无效

你没有下载预先下载好requests,先用pip指令下载
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 13:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表