求救如下代码在vsc中正常运行,用pyinstaller编译.exe后,报错:
https://www.wireking.com/product.aspx?ParentId=4
20
src=/Upload/2020系列图/五金/中英系列图一家居收纳车系列rollingcart01-11325285039.jpg
https://www.wireking.com/Upload/2020系列图/五金/中英系列图一家居收纳车系列rollingcart01-11325285039.jpg
Exception in Tkinter callback
Traceback (most recent call last):
File "tkinter_init_.py", line 1883, in call
File "get_html.py", line 80, in ok
File "get_html.py", line 206, in get_html_img
FileNotFoundError: [Errno 2] No such file or directory: './down_jpg/0.jpg'
以上为报错
import requests, bs4,sys
import tkinter as win
from tkinter import messagebox
class win_main(win.Tk): # 主窗体
def __init__(self):
super().__init__()
self.title('获取网页图片src=')
# self.config(background="green")
# self.url_m1 = win.StringVar()
self.url_c1 = win.StringVar() # 初始化变量
self.class_name1 = win.StringVar()
self.label_nr = win.StringVar()
self.resizable(width=False, height=False)
# self['background'] = 'white'
screenheight = self.winfo_screenheight()
screenwidth = self.winfo_screenwidth()
win_width = 800
win_height = 450
self.geometry(
'%dx%d+%d+%d' % (win_width, win_height, (screenwidth-800) / 2, (screenheight - win_height) / 2))
# self.protocol('WM_DELETE_WINDOW', self.cancel)
"""self.overrideredirect(1) # 隐藏标题栏"""
"""self.attributes('-toolwindow', True) # 隐藏标题栏最大化与最小化,只保留关闭按钮"""
self.setup_UI()
def setup_UI(self): # 录入窗体函数
main = win.Frame(self,bg="blue",width=300,height=450)
main.pack(anchor=win.NE, side=win.RIGHT)
# 第一行
row1 = win.Frame(main, bg='white')
row1.pack(padx=2, pady=10)
win.Label(row1, text="下载网址:", font=("微软雅黑", 12, 'bold'), fg='white', bg='navy').pack(side=win.RIGHT)
win.Entry(row1, textvariable=self.url_c1, width=34, bd=2).pack(side=win.RIGHT)
self.url_c1.set("")
# 第二行
row2 = win.Frame(main, bg='blue')
row2.pack(padx=2, pady=5)
win.Label(row2, text="查询元素:", font=("微软雅黑", 12, 'bold'), fg='white', bg='navy').pack(side=win.RIGHT)
win.Entry(row2, textvariable=self.class_name1, width=34,bd=2).pack(side=win.RIGHT)
# 第三行
row3 = win.Frame(main, bg='blue')
row3.pack(padx=65, pady=15)
win.Button(row3, text='重置', width=9, command=self.cancel,
font=("微软雅黑", 9, 'bold'), fg='white',bg='navy', borderwidth=1,
highlightbackground="navy").pack(side=win.RIGHT, padx=5)
win.Button(row3, text='确定', width=9, command=self.ok,
font=("微软雅黑", 9, 'bold'), fg='white',bg='navy', borderwidth=1,
highlightbackground="navy").pack(side=win.RIGHT, padx=5)
# 第四行
row4 = win.Frame(main, bg='blue')
row4.pack(padx=2, pady=15)
win.Label(row4, text="查询元素:img或img[class='类名'", font=("微软雅黑", 12, 'bold'), fg='white', bg='navy').pack(side=win.RIGHT)
# 左侧显示窗口
left1_js = win.Frame(self,bg="white",width=490,height=450)
left1_js.pack(side=win.RIGHT)
self.text_label = win.Label(left1_js,bg="white",textvariable=self.label_nr).pack()
self.label_nr.set("下载记录内容")
self.text_js = win.Text(left1_js, width=70, height=25, bg='#FFFACD', font=("微软雅黑", 9), pady=0, padx=1)
self.text_js.pack()
def ok(self):
de = ""
if str(self.url_c1.get()) == "" or str(self.class_name1.get()) == "":
win.messagebox.showinfo('提示', '请输入下载网址与关键字')
self.focus()
return
self.text_js.delete(1.0,win.END)
self.label_nr.set("正在下载。。。。。。。。")
de = self.get_html_img()
self.label_nr.set(de)
win.messagebox.showinfo('提示', de)
def cancel(self):
"""self.userinfo = None # 空值"""
self.url_c1.set("")
self.class_name1.set("")
self.text_js.delete(1.0,win.END)
self.label_nr.set("下载记录内容")
def get_html_img(self):
# 获取网址创建对象,检查网址是否正确。
url_c1_w = '' # 下载子网址
htm_str = "" # 下载图片网址
url_www = '' # 域名
down = '' # 下载绝对地址
exp = ""
'''
user_agents = [
'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11',
'Opera/9.25 (Windows NT 5.1; U; en)',
'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
'Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3.5.5 (like Gecko) (Kubuntu)',
'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
'Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.2.9',
"Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.7 (KHTML, like Gecko) Ubuntu/11.04 Chromium/16.0.912.77 Chrome/16.0.912.77 Safari/535.7",
"Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0) Gecko/20100101 Firefox/10.0 ",
]
'''
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'
}
try:
url_c1_w = self.url_c1.get().strip().strip('\n')
if url_c1_w[-1] == '/':
url_c1_w = url_c1_w.strip('/')
print(url_c1_w)
res = requests.get(url_c1_w,headers=headers)
# res.encoding = 'gbk' # 转码,避免乱码
res.raise_for_status() # 检查网址是否下载成功
except Exception as exc:
return '网页下载失败1'+str(exc)
# sys.exit()
quit()
html = res.text # 下载网址文件
noStarchSoup = bs4.BeautifulSoup(html,features='lxml') # 网址传递给解析对象
# sprint(type(noStarchSoup))
elems = noStarchSoup.select(self.class_name1.get().strip().strip('\n')) # 寻找网页元素存储在列表。
# print(elems)
print(len(elems))
if 'com' in url_c1_w:
url_www = url_c1_w.split('com')[0]+'com'
if 'cn' in url_c1_w:
url_www = url_c1_w.split('cn')[0]+'cn'
if 'xyz' in url_c1_w:
url_www = url_c1_w.split('xyz')[0]+'xyz'
if 'org' in url_c1_w:
url_www = url_c1_w.split('org')[0]+'org'
if 'net' in url_c1_w:
url_www = url_c1_w.split('net')[0]+'net'
if 'cc' in url_c1_w:
url_www = url_c1_w.split('cc')[0]+'cc'
if 'vip' in url_c1_w:
url_www = url_c1_w.split('vip')[0]+'vip'
if 'online' in url_c1_w:
url_www = url_c1_w.split('online')[0]+'online'
if 'tech' in url_c1_w:
url_www = url_c1_w.split('tech')[0]+'tech'
# print(url_www)
for i in range(len(elems)):
try:
# print(elems[0].getText()) # 打印索引关键字之间元素
# print(elems[0]) # 打印包含元素的HTML代码
htm_str = elems[i].attrs['src']
print("src="+htm_str)
except IndexError as exc:
return '列表无索引'+str(exc)
if '.' in htm_str[-7:]:
# 判断下载链接地址是否绝对地址
if 'https' in htm_str or 'http' in htm_str:
down = htm_str
elif '//' in htm_str:
if url_www[:7] == 'https:':
down = 'https:'+htm_str
if url_www[:6] == 'http:':
down = 'http:'+htm_str
elif htm_str[0] == '/':
down = url_www+htm_str
else:
down = url_www+'/'+htm_str
print(down)
# self.text_js.insert('insert', down+'\n') # 插入文本显示框
# 下载html图片
try:
res1 = requests.get(down,headers=headers)
# res.encoding = 'gbk' # 转码,避免乱码
res1.raise_for_status() # 检查网址是否下载成功
# print(url_m + htm_str)
except Exception as exc:
return '图片下载失败2'+str(exc)
# sys.exit()
quit()
exp = htm_str.split('.')[-1]
if 'png' in exp:
exp = 'png'
elif 'jpg' in exp:
exp = 'jpg'
elif 'gif' in exp:
exp = 'gif'
elif 'jpeg' in exp:
exp = 'jpeg'
elif 'bmp' in exp:
exp = 'bmp'
else:
exp = 'jpg'
htm_file = open('./down_jpg/'+str(i)+'.'+exp,'wb') # 打开二进制写入模式。
for chunk1 in res1.iter_content(100000):
htm_file.write(chunk1)
htm_file.close()
return '已全部下载完成'
if __name__ == "__main__":
app = win_main()
app.mainloop()
图片和exe文件不在同一位置,把down_jpg文件夹移到exe的目录处即可
html_file=open(......)那行文件路径写的是相对路径,不打包运行没问题,打包后这样写不行的,写成绝对路径看看。采纳哦!
1、程序打包为.exe文件后,所需的各种图片或者目录资源建议放在同打包文件同一目录下,否则大概率会会出现文件无法找到的报错(如果写的是相对路径的话,写绝对路径就不会有这些问题)
不知道你这个问题是否已经解决, 如果还没有解决的话: