如何读取HTTP响应提取指定内容?解决爬虫NoneType迭代错误
PDF下载爬虫问题排查与优化
问题描述
- 开发PDF下载爬虫时,计划搜索页面中同时存在
<i>和<a>标签的元素,确认后写入TXT文件用于后续URL提取。 - 执行
if FILETYPE in file_link:代码时触发错误:
if FILETYPE in file_link: TypeError: argument of type 'NoneType' is not iterable
- 同时需要了解如何读取HTTP响应并提取特定部分。
现有代码如下:
from bs4 import BeautifulSoup as bs import requests import constants as c URL = c.url DOMAIN = c.domain FILETYPE = '.html' def get_soup(url): return bs(requests.get(url).text, 'html.parser') for link in get_soup(URL).find_all('a'): file_link = link.get('href') if FILETYPE in file_link: print(f"{DOMAIN}{file_link}")
问题解决
1. 修复NoneType错误
错误根源是部分<a>标签没有href属性,link.get('href')返回None,而None无法参与in成员判断。解决方式是先校验file_link不为空,再进行文件类型检查:
for link in get_soup(URL).find_all('a'): file_link = link.get('href') # 先确认file_link存在,再检查文件类型 if file_link and FILETYPE in file_link: print(f"{DOMAIN}{file_link}")
2. 筛选同时包含<i>和<a>的元素
要确保<a>标签内存在<i>标签,可通过BeautifulSoup的嵌套查找实现:
# 查找所有包含<i>子标签的<a>标签 for a_tag in get_soup(URL).find_all('a', recursive=True): if a_tag.find('i'): # 判断<a>标签内是否存在<i>子标签 file_link = a_tag.get('href') if file_link and FILETYPE in file_link: # 写入TXT文件(追加模式) with open('valid_links.txt', 'a', encoding='utf-8') as f: f.write(f"{DOMAIN}{file_link}\n")
3. 读取HTTP响应并提取特定部分
通过requests.get(url)获取响应对象后,可访问以下属性提取对应内容:
response.text:获取解码后的响应文本内容response.content:获取二进制响应内容(适合PDF等文件下载)response.headers:获取响应头信息response.status_code:获取HTTP状态码(用于校验请求是否成功)
示例:提取响应中特定区域的内容
response = requests.get(URL) # 校验请求是否成功 if response.status_code == 200: soup = bs(response.text, 'html.parser') # 提取id为pdf-container的div区域 target_area = soup.find('div', id='pdf-container') if target_area: # 提取该区域内的所有<a>标签 valid_links = target_area.find_all('a') # 后续处理链接逻辑...
内容的提问来源于stack exchange,提问作者C4r
相关产品推荐
相关产品推荐

