我这几行代码哪里错了, f.write(book_content.text)一直在报错
with open('./book/' + book_titil + '.text' , 'a' , encoding='utf-8') as f:
f.write(book_content.text)
print('下载成功',book_titil)
我这几行代码哪里错了, f.write(book_content.text)一直在报错
with open('./book/' + book_titil + '.text' , 'a' , encoding='utf-8') as f:
f.write(book_content.text)
print('下载成功',book_titil)
可能是目标网页内容错误,导致语句“book_content = soup.find('div',id='content')”没有获取到id='content'的div标签。(报错简析见文末)
这类错误非常常见(尤其是一些运维不认真、运行得不到高标准保障的小说网站),其实就是目标网页内容一片空白,或者是网页上只有报错信息,这都属于网站没有正确将数据分配到子网页上,不用太担心,只要在代码里添加try结构去捕获异常、跳过空白网页就行了。
像这样:
def get_book(url):
error_links=[]
......
for book_info in book_data:
try:
......
except AttributeError:
error_links.append(book_url)
当然,也可以像上例所示的那样添加error_links列表,获取引发报错的网页地址,核实缺失的信息,再通过其他渠道获取缺失的小说内容。
注意:一定要把try塞到for循环里去,否则程序运行一半就崩了。还有,要先保证没有其他因素引发AttributeError(如语法不规范),否则会有异常的错误捕获来误导。
简析报错信息:
AttributeError: 'NoneType' object has no attribute 'text"
File "C: \Users (Administrator(Desktop(PythoniRV\book_spider.py", line 58, in get_book
f.write(book_content. text)
File "C: \Users (Administrator(Desktop(PythoniRV小\book_spider.py", line 67, in <module>
get_book(url)
这个报错信息意味着自定义函数get_book(url)中的book_content变量没有获取到本次的值,只不过被本次的初始化操作清空了上一次的赋值。而这个变量用于储存获取到的目标网页的id="content"的div标签的文字信息,它没有被赋值,就说明目标网页不存在这一标签,或是目标网页这一标签没有文字信息。
说白了,不是目标网页的服务器分配信息的时候出错了,就是目标网址指向了其他的网页。当然,大多数时候是前者。
您可以采用上面代码块里的方式捕获异常网页,再去人工查看网页,应该八九不离十。