使用BeautifulSoup爬取老友记台词遇NoneType属性错误求助
解决爬取Friends台词时的AttributeError问题
嘿,我来帮你搞定这个爬取Friends台词时遇到的错误!你碰到的AttributeError: 'NoneType' object has no attribute 'text',本质是代码里假设每个<dt>标签里都一定有<b>元素,但实际网页里有些<dt>可能没有这个标签,导致result.find('b')返回了None,这时候再调用.text自然就报错了。
咱们来一步步修正这个问题:
错误根源分析
原代码里character = result.find('b').text这行没有做容错处理——如果某个<dt>节点里找不到<b>标签,find('b')就会返回None,直接访问.text就触发了AttributeError。另外原代码用result.contents[1][1:-2]来取台词也太依赖固定的页面结构,万一网页内容有调整,这个索引就会失效。
修正后的代码
下面是加了容错处理、更稳健的版本:
import bs4 import requests import re # 获取剧集网页 epPage = requests.get('http://www.friends-tv.org/zz101.html') epPage.raise_for_status() # 用BeautifulSoup解析页面 soup = bs4.BeautifulSoup(epPage.text, 'lxml') results = soup.find_all('dt') # 填充台词列表 quotes = [] for result in results: # 先检查是否存在<b>角色标签,不存在就跳过当前项 character_tag = result.find('b') if not character_tag: continue # 提取角色名并清理多余空格 character = character_tag.text.strip() # 提取<b>标签之后的台词内容,拼接所有文本节点 speech = '' for content in character_tag.next_siblings: if isinstance(content, str): speech += content.strip() # 确保台词不为空再加入列表 if speech: quotes.append((character, speech)) print(quotes)
关键修正点
- 增加角色标签存在性判断:先判断
character_tag是否存在,不存在就跳过当前<dt>,避免None调用.text的错误 - 灵活提取台词:用
next_siblings获取角色标签之后的所有文本内容,比依赖固定的contents索引更适配网页结构的变化 - 清理冗余格式:用
strip()去掉文本里多余的空格、换行符,让提取的内容更干净
内容的提问来源于stack exchange,提问作者Quotennial
相关产品推荐
相关产品推荐

