TypeError: write() argument must be str, not None报错怎么解决

显示报错TypeError: write() argument must be str, not None

Traceback (most recent call last):
File "H:\Pycharm\Project\Python\Novel\Novel.py", line 73, in
main(url)
File "H:\Pycharm\Project\Python\Novel\Novel.py", line 69, in main
save(name, novel_content[0], novel_content[1]) # 调用了保存函数
File "H:\Pycharm\Project\Python\Novel\Novel.py", line 54, in save
f.write(title)
TypeError: write() argument must be str, not None

def get_response(html_url):
    """发送请求函数"""
    response = requests.get(html_url)
    return response


def get_novel_url(html_url):
    """获取所有章节url地址"""
    response = get_response(html_url)
    selector = parsel.Selector(response.text)
    href = selector.css('#list dd a::attr(href)').getall()
    return href


def get_novel_content(html_url):
    """获取小说的内容"""
    response = get_response(html_url)
    selector = parsel.Selector(response.text)
    title = selector.css('.bookname h1::text').get()
    content_list = selector.css('#content::text').getall()
    content = '\n'.join(content_list)
    novel_content = [title, content]
    return novel_content
    print(title)

def save(name, title, content):
    """保存数据"""
    with open(name + '.txt', mode='a', encoding='utf-8') as f:
        f.write(title)
        f.write('\n')
        f.write(content)
        f.write('\n')


def main(html_url):
    """主函数"""
    response_1 = get_response(html_url)
    selector = parsel.Selector(response_1.text)
    name = selector.css('#info h1::text').get()
    href = get_novel_url(html_url)  # 调用了获取小说章节url地址的函数
    for index in tqdm(href):
        index_url = 'https://www.biqugee6.com' + index
        novel_content = get_novel_content(html_url)  # 调用了获取小说内容的函数
        save(name, novel_content[0], novel_content[1])  # 调用了保存函数


url = 'https://www.biqugee6.com/book/657/'
main(url)

报错是 save 函数的 f.write(title),那就说明 title 是 None,你可以 print 以下,看一下 novel_content 的内容。

  • 以下回答由chatgpt基于相关博客总结生成:

    针对报错信息"TypeError: write() argument must be str, not None",需要首先定位出出错的代码行数,即69行、73行和54行。可能的原因是在这几行代码中传递了空值(None),而参数必须是字符串类型。解决方法有以下几种:

    1. 检查代码中相应的变量是否被正确地初始化或赋值。如果变量未被初始化或赋值,就会默认为None,需要将其手动赋值为字符串类型。

    2. 检查代码中函数或方法的返回值是否为None,如果是,则需要进行异常处理或返回正确的字符串类型。

    3. 检查代码中使用的库或模块是否被正确地调用。如果库或模块未被正确地调用,可能会返回空值或None,需要正确地调用相应的库或模块。

    下面给出一个可能的解决方案:

    # 在代码中对可能出现None值的变量进行初始化或赋值
    my_string = ""
    if some_variable is not None:
        my_string = str(some_variable)
    
    # 检查函数或方法的返回值是否为None,进行异常处理或返回正确的字符串类型
    def my_function():
        # some code here
        if result is not None:
            return str(result)
        else:
            raise ValueError("Result is None")
    
    # 检查相应的库或模块是否被正确地调用,在调用前进行判断,避免返回空值或None
    import my_module
    if my_module is not None:
        result = my_module.do_something()
        if result is not None:
            my_string = str(result)
    

    需要根据实际代码进行具体的修改和调整。