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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:38:08