关于教程提供源代码报错问题
收藏
快速回复
AI Studio平台使用 问答Notebook项目 831 6
关于教程提供源代码报错问题
收藏
快速回复
AI Studio平台使用 问答Notebook项目 831 6

https://aistudio.baidu.com/aistudio/education/group/info/789   最近在看这个课程学习,但是在学到豆瓣电影爬取那节时课程给的源代码无法运行,以下是课程源代码

# 安装beatifulSoup4
# beatifulSoup4是一个著名的爬虫框架

!pip install bs4
# 安装openpyxl
# xlwt,xlrd是Python写Excel文件用的package. 
# 有严重的兼容性问题, 在windows上请尽量使用VSTO!! 在Python 3.5环境中可凑活使用openpyxl

!pip install openpyxl

#载入必要package

import sys
import time
from bs4 import BeautifulSoup
import re
import urllib
import openpyxl
#定义一个方法, 获得页面全部内容

def askURL(url):
    request = urllib.request.Request(url)#发送请求
    try:
        response = urllib.request.urlopen(request)#取得响应
        html= response.read()#获取网页内容
        # print (html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print (e.code)
        if hasattr(e,"reason"):
            print (e.reason)
    return html
#获取相关内容
#Warning: 解析页面的代码和页面结构强相关, 当页面html结构发生变化的时候必须同步升级, 否则当场作废

def getData(baseurl):
    findLink=re.compile(r'')#找到影片详情链接 findImgSrc=re.compile(r'(.*)')#找到片名 #找到评分 findRating=re.compile(r'(.*)') #找到评价人数 findJudge=re.compile(r'(\d*)人评价') #找到概况 findInq=re.compile(r'(.*)') #找到影片相关内容:导演,主演,年份,地区,类别 findBd=re.compile(r'

(.*?)

',re.S) #去掉无关内容 remove=re.compile(r' |\n|
|\.*') datalist=[] for i in range(0,10): url=baseurl+str(i*25) html=askURL(url) soup = BeautifulSoup(html, "html.parser") for item in soup.find_all('div',class_='item'):#找到每一个影片项 data=[] item=str(item)#转换成字符串 # 影片详情链接 link=re.findall(findLink,item)[0] data.append(link)#添加详情链接 imgSrc=re.findall(findImgSrc,item)[0] data.append(imgSrc)#添加图片链接 titles=re.findall(findTitle,item) #片名可能只有一个中文名,没有外国名 if(len(titles)==2): ctitle=titles[0] data.append(ctitle)#添加中文片名 otitle=titles[1].replace("/","")#去掉无关符号 data.append(otitle)#添加外国片名 else: data.append(titles[0])#添加中文片名 data.append(' ')#留空 rating=re.findall(findRating,item)[0] data.append(rating)#添加评分 judgeNum=re.findall(findJudge,item)[0] data.append(judgeNum)#添加评论人数 inq=re.findall(findInq,item) #可能没有概况 if len(inq)!=0: inq=inq[0].replace("。","")#去掉句号 data.append(inq)#添加概况 else: data.append(' ')#留空 bd=re.findall(findBd,item)[0] bd=re.sub(remove,"",bd) bd=re.sub('(\s+)?'," ",bd) #去掉
bd=re.sub('/', " ",bd)#替换/ data.append(bd.strip()) datalist.append(data) time.sleep(5) return datalist #将相关数据写入excel中 def saveData(datalist,savepath): book=openpyxl.Workbook() sheet = book.create_sheet("豆瓣电影Top250") #sheet=book.add_sheet('豆瓣电影Top250',cell_overwrite_ok=True) col=('电影详情链接','图片链接','影片中文名','影片外国名', '评分','评价数','概况','相关信息') sheet.append(col) #添加列头 for i in range(0,250): data=datalist[i] for j in range(0,8): sheet.cell(row = (i+2),column = (j+1),value = data[j]) #openpyxl中的单元格计数从1开始, 加上第一行是列头, 要多跳一个 #openpyxl中的计数和Excel内的计数方式一致, 但和常规编程从0开始的方式相左 book.save(savepath) #保存 def main(): print ("开始爬取......") baseurl='https://movie.douban.com/top250?start=' datalist=getData(baseurl) savapath=u'/home/aistudio/work/豆瓣电影Top250.xlsx' saveData(datalist,savapath) main() print ("爬取完成,请查看.xlsx文件") from pandas import Series,DataFrame import pandas as pd #打印一些样例数据观察 from openpyxl import load_workbook wb = load_workbook(filename = 'work/豆瓣电影Top250.xlsx') sheet_ranges = wb['豆瓣电影Top250'] #将第一列的前几行打印出来 for i in range (1,8): print(sheet_ranges['A'+i.__str__()].value) #如果没有问题, 就将该工作表转为dataframe格式 df = DataFrame(sheet_ranges.values)

下面是报错信息:

开始爬取......
418


---------------------------------------------------------------------------UnboundLocalError Traceback (most recent call last) in
----> 1 main()
2
3 print ("爬取完成,请查看.xlsx文件")
in main()
3 print ("开始爬取......")
4 baseurl='https://movie.douban.com/top250?start='
----> 5 datalist=getData(baseurl)
6 savapath=u'/home/aistudio/work/豆瓣电影Top250.xlsx'
7 saveData(datalist,savapath)
in getData(baseurl)
20 for i in range(0,10):
21 url=baseurl+str(i*25)
---> 22 html=askURL(url)
23 soup = BeautifulSoup(html, "html.parser")
24 for item in soup.find_all('div',class_='item'):#找到每一个影片项
in askURL(url)
12 if hasattr(e,"reason"):
13 print (e.reason)
---> 14 return html
UnboundLocalError: local variable 'html' referenced before assignment

希望可以帮助我解答一下,谢谢各位!

0
收藏
回复
全部评论(6)
时间顺序
AIStudio810258
#2 回复于2020-05

错误信息是html在声明前被调用了

0
回复
AIStudio810258
#3 回复于2020-05

在函数开头先声明下

html = ''

就好了

0
回复
AIStudio810258
#4 回复于2020-05

来AI Studio互粉吧~等你哦~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/76563

【一些项目,有空可以fork玩玩】

训练数据太少?过拟合?一文带你领略“数据增长魔法”(上) (https://aistudio.baidu.com/aistudio/projectdetail/408059)

训练数据太少?过拟合?一文带你领略“数据增长魔法”(下) (https://aistudio.baidu.com/aistudio/projectdetail/422256)

一文帮你理解用Paddle训练模型的原理1-手写回归模型 (https://aistudio.baidu.com/aistudio/projectdetail/367090)

一文帮你理解用Paddle训练模型的原理2-权值可视化(VisualDL) (https://aistudio.baidu.com/aistudio/projectdetail/386954)

0
回复
泉水指挥官
#5 回复于2020-05
在函数开头先声明下 html = '' 就好了

好的!谢谢了!

0
回复
CQ-Shang
#6 回复于2020-05
在函数开头先声明下 html = '' 就好了

厉害厉害

0
回复
AIStudio810258
#7 回复于2020-05
厉害厉害

不知道是不是讲课老师使的“坏儿”,防止上课的小伙伴儿们偷懒

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户