Python爬虫代码抛出TypeError:期望字符串类对象却得到NoneType
问题排查与解决
错误分析
你遇到的TypeError: expected string or bytes-like object, got 'NoneType',根源是传入extractor.extract()的source参数为None,导致selectorlib无法处理空值。
可能的原因及对应解决方法
1. 未正确定义或传入请求头(HEADERS)
代码中scrape函数使用了HEADERS变量,但未定义该变量,且requests.get()的参数传入方式错误:
requests.get(url, HEADERS)会将HEADERS当作params参数传入,而非请求头;- 未定义
HEADERS会直接触发NameError,若未捕获异常,函数会默认返回None。
解决方法:
- 定义标准请求头模拟浏览器访问;
- 使用关键字参数
headers传入请求头; - 添加异常处理避免请求失败时返回
None。
修改后的scrape函数:
import requests import selectorlib URL = "http://programmer100.pythonanywhere.com/tours/" # 定义请求头 HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } def scrape(url): try: # 正确传入请求头 response = requests.get(url, headers=HEADERS) # 触发HTTP状态码错误(如404、500) response.raise_for_status() source = response.text return source except requests.exceptions.RequestException as e: print(f"请求出错: {str(e)}") return None
2. 网络请求失败
若目标URL无法访问、网络中断或返回HTTP错误,scrape函数未捕获异常会默认返回None,导致后续extract函数收到空值。
解决方法:
- 上述修改后的
scrape函数已添加异常捕获,可避免请求失败时返回None; - 在主函数中判断
scraped是否有效,再执行提取逻辑:
if __name__ == "__main__": scraped = scrape(URL) if scraped: extracted = extract(scraped) print(extracted) else: print("无法获取页面内容,请检查网络或URL")
3. extract.yaml选择器配置错误
若extract.yaml中的选择器无法匹配页面内容,extractor.extract(source)["tours"]可能返回None,但这不会触发当前的NoneType错误(该错误是source为空导致)。不过仍需确保选择器正确:
- 打开目标URL,查看巡演信息对应的HTML元素;
- 调整
extract.yaml的选择器,示例:
tours: css: ".tour" type: Text
内容的提问来源于stack exchange,提问作者str_name
相关产品推荐
相关产品推荐

