鱼C论坛

 找回密码
 立即注册
查看: 1021|回复: 1

[已解决]Exception: Unexpected data type <class 're.Pattern'>

[复制链接]
发表于 2022-1-29 17:22:47 | 显示全部楼层 |阅读模式

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

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

x
Traceback (most recent call last):
  File "C:/Users/123/Desktop/12爬虫.py", line 111, in <module>
    main()
  File "C:/Users/123/Desktop/12爬虫.py", line 30, in main
    savedata(datalist,savepath)
  File "C:/Users/123/Desktop/12爬虫.py", line 105, in savedata
    sheet.write(i+1,j,data[j])#数据
  File "C:\Users\123\PycharmProjects\pythonProject2\venv\lib\site-packages\xlwt\Worksheet.py", line 1088, in write
    self.row(r).write(c, label, style)
  File "C:\Users\123\PycharmProjects\pythonProject2\venv\lib\site-packages\xlwt\Row.py", line 254, in write
    raise Exception("Unexpected data type %r" % type(label))
Exception: Unexpected data type <class 're.Pattern'>
一下上面这个又是什么原因啊,谢了,能解释一下这个是什么意思吗


  1. from bs4 import BeautifulSoup #网页解析
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request, urllib.error
  4. import xlwt#进行excel操作
  5. import sqlite3#进行SQlite数据库操作


  6. #影片详情链接的规则
  7. findlink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串模式)
  8. #影片图片的链接
  9. findimgscr = re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
  10. #影片片名
  11. findtitle = re.compile(r'<span class="title">(.*)</span>')
  12. #影片的评分
  13. findrating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  14. #找到评价人数
  15. findnum = re.compile(r'<span>(\d*)人评价</span>')
  16. #找到概况
  17. findgk = re.compile(r'<span class="inq">(.*)</span>')
  18. #找到影片的相关内容
  19. findabout = re.compile(r'<p class="">(.*?)</p>', re.S)

  20. def main():
  21.     baseurl = "https://movie.douban.com/top250?start="
  22.     #爬取网页
  23.     datalist = getdata(baseurl)

  24.     # 前面的为用excel表格存储
  25.     savepath = "豆瓣电影top250.xls"
  26.     savedata(datalist,savepath)

  27. #爬取网页
  28. def getdata(baseurl):
  29.     datalist = []
  30.     for i in range(0,10):#调用获取页面信息的函数,10次
  31.         url = baseurl + str(i*25)
  32.         html = askURL(url)#保存获取到的网页源码
  33.           #逐一解析数据
  34.         soup = BeautifulSoup(html,"html.parser")
  35.         for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
  36.             #测试查看电影item全部信息
  37.             data = []#保存一部电影的全部信息
  38.             item = str(item)
  39.             # 获取影片的超链接
  40.             link = re.findall(findlink,item)[0]  #re库用来通过正则表达式查找指定的字符串
  41.             imgscr = re.findall(findimgscr,item)[0]  #添加图片
  42.             data.append(findimgscr)
  43.             titles = re.findall(findtitle,item)[0]#片名可能只有一个中文名,没有外文
  44.             if (len(titles)==2):
  45.                 ctitle = titles[0]
  46.                 data.append(ctitle)#添加中文名
  47.                 otitle = titles[1].replace("/","")#去掉无关的符号
  48.                 data.append(otitle)#添加外国名
  49.             else:
  50.                 data.append(titles[0])
  51.                 data.append('')#外国名字留空
  52.             rating = re.findall(findrating,item)[0]#添加评分
  53.             data.append(rating[0])

  54.             num =re.findall(findnum,item)[0]
  55.             data.append(num[0])#添加评价人数
  56.             gk = re.findall(findgk,item)
  57.             if len(gk)!= 0:
  58.                 gk =gk[0].replace("。","")
  59.                 data.append(gk)  # 添加概况
  60.             else:
  61.                 data.append(" ")
  62.             about = re.findall(findabout,item)
  63.             about = re.sub('<br(\s+)?/>(\s+)?', "", str(about))#去掉<br/>
  64.             about = re.sub('/',"",about)#替换/
  65.             data.append(about.strip())#去掉前面的空格
  66.             datalist.append(data)#把处理好的一部电影信息放入datalist
  67.     return datalist


  68. #得到指定一个url的网页内容
  69. def askURL(url):
  70.     head = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Mobile Safari/537.36"}
  71.     request = urllib.request.Request(url,headers= head)
  72.     html = ""
  73.     try:
  74.         response = urllib.request.urlopen(request)
  75.         html = response.read().decode("utf-8")
  76.     except urllib.error.URLError as e:
  77.         if hasattr(e,"code"):
  78.             print(e.code)
  79.         if hasattr(e,"reason"):
  80.             print(e.reason)
  81.     return html

  82. #保存数据
  83. #用excel
  84. def savedata(datalist,savepath):
  85.     print("savepath……")

  86.     book = xlwt.Workbook(encoding="utf-8",style_compression=0)#创建workbook对象
  87.     sheet = book.add_sheet('豆瓣电影top250',cell_overwrite_ok=True)#创建工作表
  88.     col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
  89.     for i in range(0,8):
  90.         sheet.write(0,i,col[i])#列名
  91.     for i in range(0,250):
  92.         #print("第%d条"%(i+1))
  93.         data = datalist[i]
  94.         for j in range(0,8):
  95.             sheet.write(i+1,j,data[j])#数据
  96.     book.save(savepath)#保存



  97. if __name__ == "__main__": #调用函数,当程序执行时
  98.     main()

  99. #用数据库时
  100. #if __name__ == "__main__":
  101. #     init_db("movietest,db")
  102. print("爬取完成")


















复制代码
最佳答案
2022-1-30 18:00:32
本帖最后由 isdkz 于 2022-1-30 18:16 编辑

47行改成data.append(imgscr),你写入excel表的时候报这个错Exception: Unexpected data type <class 're.Pattern'>就是它不期望得到一个正则表达式的实例,很明显你的datalist中存在这样的实例,也就是说你误把正则表达式的实例添加进列表了

  1. from bs4 import BeautifulSoup #网页解析
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request, urllib.error
  4. import xlwt#进行excel操作
  5. import sqlite3#进行SQlite数据库操作


  6. #影片详情链接的规则
  7. findlink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串模式)
  8. #影片图片的链接
  9. findimgscr = re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
  10. #影片片名
  11. findtitle = re.compile(r'<span class="title">(.*)</span>')
  12. #影片的评分
  13. findrating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  14. #找到评价人数
  15. findnum = re.compile(r'<span>(\d*)人评价</span>')
  16. #找到概况
  17. findgk = re.compile(r'<span class="inq">(.*)</span>')
  18. #找到影片的相关内容
  19. findabout = re.compile(r'<p class="">(.*?)</p>', re.S)

  20. def main():
  21.     baseurl = "https://movie.douban.com/top250?start="
  22.     #爬取网页
  23.     datalist = getdata(baseurl)

  24.     # 前面的为用excel表格存储
  25.     savepath = "豆瓣电影top250.xls"
  26.     savedata(datalist,savepath)

  27. #爬取网页
  28. def getdata(baseurl):
  29.     datalist = []
  30.     for i in range(0,10):#调用获取页面信息的函数,10次
  31.         url = baseurl + str(i*25)
  32.         html = askURL(url)#保存获取到的网页源码
  33.           #逐一解析数据
  34.         soup = BeautifulSoup(html,"html.parser")
  35.         for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
  36.             #测试查看电影item全部信息
  37.             data = []#保存一部电影的全部信息
  38.             item = str(item)
  39.             # 获取影片的超链接
  40.             link = re.findall(findlink,item)[0]  #re库用来通过正则表达式查找指定的字符串
  41.             imgscr = re.findall(findimgscr,item)[0]  #添加图片
  42.             data.append(imgscr)   # 修改这一行
  43.             titles = re.findall(findtitle,item)[0]#片名可能只有一个中文名,没有外文
  44.             if (len(titles)==2):
  45.                 ctitle = titles[0]
  46.                 data.append(ctitle)#添加中文名
  47.                 otitle = titles[1].replace("/","")#去掉无关的符号
  48.                 data.append(otitle)#添加外国名
  49.             else:
  50.                 data.append(titles[0])
  51.                 data.append('')#外国名字留空
  52.             rating = re.findall(findrating,item)[0]#添加评分
  53.             data.append(rating[0])

  54.             num =re.findall(findnum,item)[0]
  55.             data.append(num[0])#添加评价人数
  56.             gk = re.findall(findgk,item)
  57.             if len(gk)!= 0:
  58.                 gk =gk[0].replace("。","")
  59.                 data.append(gk)  # 添加概况
  60.             else:
  61.                 data.append(" ")
  62.             about = re.findall(findabout,item)
  63.             about = re.sub('<br(\s+)?/>(\s+)?', "", str(about))#去掉<br/>
  64.             about = re.sub('/',"",about)#替换/
  65.             data.append(about.strip())#去掉前面的空格
  66.             datalist.append(data)#把处理好的一部电影信息放入datalist
  67.     return datalist


  68. #得到指定一个url的网页内容
  69. def askURL(url):
  70.     head = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Mobile Safari/537.36"}
  71.     request = urllib.request.Request(url,headers= head)
  72.     html = ""
  73.     try:
  74.         response = urllib.request.urlopen(request)
  75.         html = response.read().decode("utf-8")
  76.     except urllib.error.URLError as e:
  77.         if hasattr(e,"code"):
  78.             print(e.code)
  79.         if hasattr(e,"reason"):
  80.             print(e.reason)
  81.     return html

  82. #保存数据
  83. #用excel
  84. def savedata(datalist,savepath):
  85.     print("savepath……")

  86.     book = xlwt.Workbook(encoding="utf-8",style_compression=0)#创建workbook对象
  87.     sheet = book.add_sheet('豆瓣电影top250',cell_overwrite_ok=True)#创建工作表
  88.     col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
  89.     for i in range(0,8):
  90.         sheet.write(0,i,col[i])#列名
  91.     for i in range(0,250):
  92.         #print("第%d条"%(i+1))
  93.         data = datalist[i]
  94.         for j in range(0,8):
  95.             sheet.write(i+1,j,data[j])#数据
  96.     book.save(savepath)#保存



  97. if __name__ == "__main__": #调用函数,当程序执行时
  98.     main()

  99. #用数据库时
  100. #if __name__ == "__main__":
  101. #     init_db("movietest,db")
  102. print("爬取完成")


















复制代码
















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

使用道具 举报

发表于 2022-1-30 18:00:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-1-30 18:16 编辑

47行改成data.append(imgscr),你写入excel表的时候报这个错Exception: Unexpected data type <class 're.Pattern'>就是它不期望得到一个正则表达式的实例,很明显你的datalist中存在这样的实例,也就是说你误把正则表达式的实例添加进列表了

  1. from bs4 import BeautifulSoup #网页解析
  2. import re #正则表达式,进行文字匹配
  3. import urllib.request, urllib.error
  4. import xlwt#进行excel操作
  5. import sqlite3#进行SQlite数据库操作


  6. #影片详情链接的规则
  7. findlink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则(字符串模式)
  8. #影片图片的链接
  9. findimgscr = re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
  10. #影片片名
  11. findtitle = re.compile(r'<span class="title">(.*)</span>')
  12. #影片的评分
  13. findrating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
  14. #找到评价人数
  15. findnum = re.compile(r'<span>(\d*)人评价</span>')
  16. #找到概况
  17. findgk = re.compile(r'<span class="inq">(.*)</span>')
  18. #找到影片的相关内容
  19. findabout = re.compile(r'<p class="">(.*?)</p>', re.S)

  20. def main():
  21.     baseurl = "https://movie.douban.com/top250?start="
  22.     #爬取网页
  23.     datalist = getdata(baseurl)

  24.     # 前面的为用excel表格存储
  25.     savepath = "豆瓣电影top250.xls"
  26.     savedata(datalist,savepath)

  27. #爬取网页
  28. def getdata(baseurl):
  29.     datalist = []
  30.     for i in range(0,10):#调用获取页面信息的函数,10次
  31.         url = baseurl + str(i*25)
  32.         html = askURL(url)#保存获取到的网页源码
  33.           #逐一解析数据
  34.         soup = BeautifulSoup(html,"html.parser")
  35.         for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
  36.             #测试查看电影item全部信息
  37.             data = []#保存一部电影的全部信息
  38.             item = str(item)
  39.             # 获取影片的超链接
  40.             link = re.findall(findlink,item)[0]  #re库用来通过正则表达式查找指定的字符串
  41.             imgscr = re.findall(findimgscr,item)[0]  #添加图片
  42.             data.append(imgscr)   # 修改这一行
  43.             titles = re.findall(findtitle,item)[0]#片名可能只有一个中文名,没有外文
  44.             if (len(titles)==2):
  45.                 ctitle = titles[0]
  46.                 data.append(ctitle)#添加中文名
  47.                 otitle = titles[1].replace("/","")#去掉无关的符号
  48.                 data.append(otitle)#添加外国名
  49.             else:
  50.                 data.append(titles[0])
  51.                 data.append('')#外国名字留空
  52.             rating = re.findall(findrating,item)[0]#添加评分
  53.             data.append(rating[0])

  54.             num =re.findall(findnum,item)[0]
  55.             data.append(num[0])#添加评价人数
  56.             gk = re.findall(findgk,item)
  57.             if len(gk)!= 0:
  58.                 gk =gk[0].replace("。","")
  59.                 data.append(gk)  # 添加概况
  60.             else:
  61.                 data.append(" ")
  62.             about = re.findall(findabout,item)
  63.             about = re.sub('<br(\s+)?/>(\s+)?', "", str(about))#去掉<br/>
  64.             about = re.sub('/',"",about)#替换/
  65.             data.append(about.strip())#去掉前面的空格
  66.             datalist.append(data)#把处理好的一部电影信息放入datalist
  67.     return datalist


  68. #得到指定一个url的网页内容
  69. def askURL(url):
  70.     head = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Mobile Safari/537.36"}
  71.     request = urllib.request.Request(url,headers= head)
  72.     html = ""
  73.     try:
  74.         response = urllib.request.urlopen(request)
  75.         html = response.read().decode("utf-8")
  76.     except urllib.error.URLError as e:
  77.         if hasattr(e,"code"):
  78.             print(e.code)
  79.         if hasattr(e,"reason"):
  80.             print(e.reason)
  81.     return html

  82. #保存数据
  83. #用excel
  84. def savedata(datalist,savepath):
  85.     print("savepath……")

  86.     book = xlwt.Workbook(encoding="utf-8",style_compression=0)#创建workbook对象
  87.     sheet = book.add_sheet('豆瓣电影top250',cell_overwrite_ok=True)#创建工作表
  88.     col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
  89.     for i in range(0,8):
  90.         sheet.write(0,i,col[i])#列名
  91.     for i in range(0,250):
  92.         #print("第%d条"%(i+1))
  93.         data = datalist[i]
  94.         for j in range(0,8):
  95.             sheet.write(i+1,j,data[j])#数据
  96.     book.save(savepath)#保存



  97. if __name__ == "__main__": #调用函数,当程序执行时
  98.     main()

  99. #用数据库时
  100. #if __name__ == "__main__":
  101. #     init_db("movietest,db")
  102. print("爬取完成")


















复制代码
















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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 00:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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