You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:25:55