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

Python使用BeautifulSoup爬取页面到特定位置后无法读取td内容报错

问题原因
  • 部分<tr>行的DOM结构不符合预期:不是所有师资条目对应的行,姓名列(第一个<td>)和邮箱列(第三个<td>)都包裹了<a>标签。部分行的<td>下直接是纯文本,还有部分行缺失邮箱信息,执行row.find_all('td')[0].a或者row.find_all('td')[2].a时会返回None,后续调用.text就会触发你遇到的报错。
  • 报错触发后程序会直接跳出循环,还没遍历到的行对应的数组位置会保留初始化的None值,所以最终输出的数组末尾有大量None,你单独检查最后一行正常,是因为出问题的是中间的某一行,循环到那一行就终止了。
修复方案

提取内容前先做标签存在性判断,避免空值调用,同时改用列表append方法存储结果,不需要提前初始化固定长度的数组,逻辑更稳妥。如果遇到无<a>标签的行,可以直接提取<td>本身的文本内容,保证信息完整性。
修复后的代码如下:

try:
    source = rq.get('https://www.stern.nyu.edu/faculty/search_name_form')
    source.raise_for_status()
    soup = BeautifulSoup(source.text, 'html.parser')
    rows = soup.find('tbody').find_all('tr')
    names = []
    emails = []
    for row in rows:
        tds = row.find_all('td')
        # 提取姓名
        name_a = tds[0].find('a')
        if name_a:
            names.append(name_a.text)
        else:
            names.append(tds[0].text.strip())
        # 提取邮箱
        email_a = tds[2].find('a')
        if email_a:
            emails.append(email_a.text)
        else:
            # 无邮箱时填充空字符串或者其他默认值
            emails.append('')
except Exception as e:
    print(e)
  
print(names)
print(emails)

内容的提问来源于stack exchange,提问作者Vivaan Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:15:01