Board logo

标题: [问题求助] 【已解决】报错: maximum recursion depth exceeded while calling a Python object [打印本页]

作者: bingxing8000    时间: 2018-4-13 17:31     标题: 【已解决】报错: maximum recursion depth exceeded while calling a Python object

本帖最后由 bingxing8000 于 2018-4-16 15:12 编辑
  1. # pip install requests        # 安装爬虫模块,用来抓取网页的html源代码
  2. # pip install beautifulsoup4  # 安装html代码解析模块
  3. # pip install prettytable #安装PrettyTable模块,可以将输出内容如表格方式整齐地输出
  4. import requests    # 导入爬虫模块
  5. from bs4 import BeautifulSoup  # 导入html代码解析模块
  6. from prettytable import PrettyTable # 导入整齐输出模块
  7. url = "http://www.weather.com.cn/weather/101210101.shtml"
  8. get_html = requests.get(url)    # 获取html源代码
  9. soure = BeautifulSoup(get_html.content,"html.parser")
  10. body = soure.find("body")        # 找到body标签
  11. div = body.find("div",id = "7d") # 找到div开头,并且属性有"id="7d""的标签
  12. ul = div.find("ul")    # 从 div开头并且属性有"id="7d""的标签 中找到ul标签
  13. li = ul.find_all("li") # 找到所有的li标签
  14. list=[]
  15. for shuju in li:  # 遍历标签
  16.     dic={}
  17.     riqi = shuju.find("h1").string  # 找到hl标签并提取日期
  18.     dic["date"] = riqi              # 把获取到的添加到字典
  19.     tianqi= shuju.find_all("p")     # 找到所有的p标签
  20.     dic["tq"] = tianqi[0].string    #
  21.     wendu = tianqi[1].find("span")
  22.     dic["maxwd"] = wendu.string + "℃"
  23.     wendu2= tianqi[1].find("i")
  24.     dic["minwd"] = wendu2.string
  25.     fengxiang = tianqi[2].find("span")["title"]
  26.     dic["fx"] = fengxiang
  27.     fengli = tianqi[2].find("i")
  28.     dic["fl"] = fengli.string
  29.     list.append(dic)
  30. table = PrettyTable(["日期", "天气","最高温度","最低温度","风向","风力"])
  31. #for i in range(0,7):
  32. #   a = list[i]["date"],list[i]["tq"], list[i]["maxwd"], list[i]["minwd"], list[i]["fx"], list[i]["fl"]
  33. #   print(a)
  34. for i in range(0,7):
  35.     table.add_row([list[i]["date"],list[i]["tq"], list[i]["maxwd"], list[i]["minwd"], list[i]["fx"], list[i]["fl"]])
  36. print(table)
复制代码
请问:为什么会报ecursionError: maximum recursion depth exceeded while calling a Python object 错误呢?注释部分运行就可以的。
作者: codegay    时间: 2018-4-13 17:49

requests只是一个http的客户端,不是爬虫模块。
作者: bingxing8000    时间: 2018-4-16 09:25

回复 2# codegay

你好,谢谢你的指导。但我的问题是代码中的这一段
  1. table = PrettyTable(["日期", "天气","最高温度","最低温度","风向","风力"])
  2. #for i in range(0,7):
  3. #   a = list[i]["date"],list[i]["tq"], list[i]["maxwd"], list[i]["minwd"], list[i]["fx"], list[i]["fl"]
  4. #   print(a)
  5. for i in range(0,7):
  6.     table.add_row([list[i]["date"],list[i]["tq"], list[i]["maxwd"], list[i]["minwd"], list[i]["fx"], list[i]["fl"]])
  7. print(table)
复制代码
现在这段报错,提示是RecursionError: maximum recursion depth exceeded while calling a Python object,网上说是递归层太多,但是我这没怎么递归呀,只是把列表下面字典的值取出来而已。
把没有注释的部分注释掉,再把注释的部分取消注释可以正常运行。
麻烦帮我看一下是什么问题,谢谢。
作者: cfwyy77_bat    时间: 2018-4-16 12:42

python 区人气好低的~  
问题应该在prettytable 模块,这个模块我也不熟,没用过,不过我看了一下它 都5年没更新过了。
我的环境是python3.6。
把prettytable.py 第926行
改成:
  1. rows = self._rows[options["start"]:options["end"]]
复制代码
保存。他原来是deepcopy,我感觉没必要啊,我也不知道如何解释好- -
然后应该就可以跑了。

我还把你后面那段稍改了一下:
  1. tabl = PrettyTable(["日期", "天气","最高温度","最低温度","风向","风力"])
  2. templst=[list(dic.values()) for dic in lst]
  3. for i in range(7):
  4.     tabl.add_row(templst[i])
  5. print(tabl)
复制代码
其中你的变量名list  我改成了lst,因为list  是内建的列表类,用来作自定义的变量名不太好,虽然也能跑。
作者: cfwyy77_bat    时间: 2018-4-16 14:51

又改了一下,可以不用字典。
  1. import requests    # 导入爬虫模块
  2. from bs4 import BeautifulSoup  # 导入html代码解析模块
  3. from prettytable import PrettyTable # 导入整齐输出模块
  4. url = "http://www.weather.com.cn/weather/101210101.shtml"
  5. get_html = requests.get(url)    # 获取html源代码
  6. soure = BeautifulSoup(get_html.content,"html.parser")
  7. body = soure.find("body")        # 找到body标签
  8. div = body.find("div",id = "7d") # 找到div开头,并且属性有"id="7d""的标签
  9. ul = div.find("ul")    # 从 div开头并且属性有"id="7d""的标签 中找到ul标签
  10. li = ul.find_all("li") # 找到所有的li标签
  11. lst = [[i.find("h1").string,
  12.     i.find_all("p")[0].string,
  13.     i.find_all("p")[1].find("span").string+"℃",
  14.     i.find_all("p")[1].find("i").string,
  15.     i.find_all("p")[2].find("span")["title"],
  16.     i.find_all("p")[2].find("i").string] for i in li]
  17. table = PrettyTable(["日期", "天气","最高温度","最低温度","风向","风力"])
  18. for i in range(7):
  19.     table.add_row(lst[i])
  20. print(table)
复制代码

作者: bingxing8000    时间: 2018-4-16 15:10

回复 4# cfwyy77_bat
非常感谢,确实按您所说的把第926行,改成您那样的就可以运行了。
另外感谢您在解决问题的同时对其他方面的指导,谢谢。
作者: bingxing8000    时间: 2018-4-16 15:16

回复 5# cfwyy77_bat

再次感谢您




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2