运行代码发现TypeError: 'NoneType' object is not subscriptable
代码
class video_down():
head: set[str]
def __init__(self,url):
# 拼接暴风影视url
self.api='https://www.lzhs1y.com/'
self.get_url = 'https://www.lzhs1y.com/?url=' + url
#设置UA模拟浏览器访问
self.head = {'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/115.0.0.0 Safari/537.36'}
#设置多线程数量
self.thread_num=32
#当前已经下载的文件数目
self.i = 0
# 调用网页获取
html = self.get_page(self.get_url)
if html:
# 解析网页
self.parse_page(html)
def get_page(self,get_url):
try:
print('正在请求目标网页....',get_url)
response=requests.get(get_url,headers=self.head)
if response.status_code==200:
#print(response.text)
print('请求目标网页完成....\n 准备解析....')
self.head['referer'] = get_url
return response.text
except Exception:
print('请求目标网页失败,请检查错误重试')
return None
def parse_page(self,html):
print('目标信息正在解析........')
doc=pq(html)
self.title=doc('head title').text
print(self.title)
url = doc('player').attr('src')[14:]
html=self.get_m3u8_1(url).strip()
self.url = url + '800k/hls/index.m3u8'
self.url = url[:-10] +html
print(self.url)
print('解析完成,获取缓存ts文件.........')
self.get_m3u8_2(self.url)
def get_m3u8_1(self,url):
try:
response=requests.get(url,headers=self.head)
html=response.text
print('获取ts文件成功,准备提取信息')
return html[-20:]
except Exception:
print('缓存文件请求错误1,请检查错误')
def get_m3u8_2(self,url):
try:
response=requests.get(url,headers=self.head)
html=response.text
print('获取ts文件成功,准备提取信息')
self.parse_ts_2(html)
except Exception:
print('缓存文件请求错误2,请检查错误')
def parse_ts_2(self,html):
pattern=re.compile('.*?(.*?).ts')
self.ts_lists=re.findall(pattern,html)
print('信息提取完成......\n准备下载...')
self.pool()
def pool(self):
print('经计算需要下载%d个文件' % len(self.ts_lists))
self.ts_url = self.url[:-10]
if self.title not in os.listdir():
os.makedirs(self.title)
print('正在下载...所需时间较长,请耐心等待..')
#开启多进程下载
pool=Pool(16)
pool.map(self.save_ts,[ts_list for ts_list in self.ts_lists])
pool.close()
pool.join()
print('下载完成')
self.ts_to_mp4()
def ts_to_mp4(self):
print('ts文件正在进行转录mp4......')
str='copy /b '+self.title+'\*.ts '+self.title+'.mp4'
os.system(str)
filename=self.title+'.mp4'
if os.path.isfile(filename):
print('转换完成,祝你观影愉快')
shutil.rmtree(self.title)
def save_ts(self,ts_list):
try:
ts_urls = self.ts_url + '{}.ts'.format(ts_list)
self.i += 1
print('当前进度%d/%d'%(self.i,len(self.ts_lists)))
urlretrieve(url=ts_urls, filename=self.title + '/{}.ts'.format(ts_list))
except Exception:
print('保存文件出现错误')
if __name__ == '__main__':
#目标url:
url='https://v.qq.com/x/cover/mzc002003rpvd4j/n0046ht5pn8.html?ptag=11972'
video_down(url)
这个代码运行后会抛出TypeError: 'NoneType' object is not subscriptable
我未找到任何空值
问一下怎样解决
操作系统:pycharm2023.2专业版 python3.9.9
你先看下报错在哪一行上
比如说(我是假设)在这一行 url = doc('player').attr('src')[14:]
那么就是文档中 player 的 src 属性没有找到,返回了 none,然后你去访问其下标,导致错误
那么你就看这个文档解析有什么问题
【以下回答由 GPT 生成】
问题原因: 错误的原因是在代码中,某一处使用了NoneType对象进行了切片操作(subscriptable),导致出现了TypeError。
解决方案: 要解决这个问题,我们需要检查可能出现NoneType的地方,并进行必要的判断和处理。 在给出的代码中,我发现以下可能会引发NoneType错误的地方:
在get_url
作为参数调用get_page()
方法时,如果请求失败,会返回None。需要在get_page()
方法中进行判断,如果请求失败,应该返回None而不是继续执行并返回response.text。
在parse_page()
方法中,url = doc('player').attr('src')[14:]
这一行可能会出现NoneType对象。因此应该在使用切片操作之前,先进行判断是否获取到了'player'
的'src'
属性。
根据以上问题,我会给出修复后的代码:
import requests
from pyquery import PyQuery as pq
class video_down():
def __init__(self,url):
# 拼接暴风影视url
self.api = 'https://www.lzhs1y.com/'
self.get_url = 'https://www.lzhs1y.com/?url=' + url
#设置UA模拟浏览器访问
self.head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}
#设置多线程数量
self.thread_num=32
#当前已经下载的文件数目
self.i = 0
# 调用网页获取
html = self.get_page(self.get_url)
if html:
# 解析网页
self.parse_page(html)
def get_page(self,get_url):
try:
print('正在请求目标网页....',get_url)
response=requests.get(get_url,headers=self.head)
if response.status_code==200:
print('请求目标网页完成....\n 准备解析....')
self.head['referer'] = get_url
return response.text
else:
print('请求目标网页失败,请检查错误重试')
return None
except Exception as e:
print('请求目标网页失败,请检查错误重试:', e)
return None
def parse_page(self,html):
print('目标信息正在解析........')
doc=pq(html)
self.title=doc('head title').text()
print(self.title)
url = doc('player').attr('src')
if url:
url = url[14:]
html=self.get_m3u8_1(url).strip()
self.url = url + '800k/hls/index.m3u8'
self.url = url[:-10] + html
print(self.url)
print('解析完成,获取缓存ts文件.........')
self.get_m3u8_2(self.url)
else:
print("未找到资源链接")
def get_m3u8_1(self,url):
try:
response=requests.get(url,headers=self.head)
if response.status_code==200:
return response.text
else:
print('请求m3u8_1失败,请检查错误重试')
return None
except Exception as e:
print('请求m3u8_1失败,请检查错误重试:', e)
return None
# 测试代码
downloader = video_down('example_url')
请将'example_url'
替换为您要下载视频的URL。
此修复代码中处理了可能引发NoneType错误的地方,并且添加了更多的错误处理和提示。希望可以解决您遇到的问题。如果还有其他问题,请随时追问。
【相关推荐】