这个错误信息表明在你的Python程序中,re.search()
函数没有找到预期的匹配项,因此返回了 None
。当你尝试在 None
对象上调用 group(1)
方法时,Python 抛出了一个 AttributeError
。
具体来说,错误发生在 pc.py
文件的第6行,你试图从一个字符串 text_response
中提取一个数字,这个数字位于 actual_page:52 (\d+), //真实页数
这个模式的匹配结果中。但是,re.search()
没有找到这个模式,所以返回了 None
。
要解决这个问题,你可以采取以下几个步骤:
-
检查
text_response
内容:
确保text_response
包含你期望搜索的字符串。可能的情况是,text_response
的内容不是你预期的,或者格式有变。 -
验证正则表达式:
确保你的正则表达式actual_page:52 (\d+), //真实页数
是正确的。这里的\d+
是用来匹配一个或多个数字的,但前面的actual_page:52
看起来像是硬编码的数字,这可能不是通用的匹配方式。如果actual_page
后面的数字(这里是52)是变化的,那么你的正则表达式需要调整以匹配变化的数字。 -
处理
None
返回值:
在调用group(1)
之前,你应该检查re.search()
的返回值是否为None
。如果是None
,你可以添加一些错误处理逻辑,比如打印一个错误消息或者设置一个默认值 -
调整正则表达式以匹配更多情况:
如果actual_page
后面的数字是变化的,你可以使用更通用的模式,如actual_page:\d+ (\d+), //真实页数
。
通过上述步骤,你应该能够定位问题并修正它。如果问题仍然存在,可能需要进一步检查 text_response
的来源和格式。
代码:import requests, json, re, time, urllib.request def getParameter(url): # 获取文档参数 text_response = requests.get(url=url, headers=headers).text actual_page = int(re.search('actual_page:52 (\d+), //真实页数', text_response).group(1)) # 页数 aid = re.search('aid:456032948 (\d+), //解密后的id', text_response).group(1) # aid view_token = re.search('view_token:fTywuwW@c2Kh7QLBNdnrdxk0il5mF58mQT57vGVOPDc= \'(.*?)\'', text_response).group(1) # view_token print('actual_page:', actual_page, '\naid:', aid, '\nview_token:', view_token) return actual_page, aid, view_token def requests_data(parameter, page): # 请求数据 url = 'https://openapi.book118.com/getPreview.html' params = { 'project_id': '1', 'aid': parameter[1], 'view_token': parameter[2], 'page': page, } response = requests.get(url=url, headers=headers, params=params).text json_data = re.search('jsonpReturn\((.*?)\);', response).group(1) # 使用正则表达式所需数据 data = json.loads(json_data)['data'] # if data.get(str(page)) == '': # 根据需求使用 # print('数据加载失败,重新发出请求') # time.sleep(1) # return requests_data(parameter, page) # time.sleep(1) return get_data(data) def get_data(data): # 下载数据 for i in data.items(): # i[0]为页数,i[1]为网址 img_url = 'https:' + i[1] # urllib.request.urlretrieve(url=img_url, filename=r'D:/yuanChuangLi/{}.png'.format(i[0])) # 下载图片 print(i[0], img_url) if __name__ == '__main__': headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'} text_url = input('输入网址:') parameter = getParameter(text_url) for page in range(1, parameter[0], 6): requests_data(parameter, page)