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

使用Beautiful Soup提取网页表格数据报错求助:仅能获取首行数据

解决Beautiful Soup提取表格数据仅获首行的问题

嘿,我帮你排查了代码里的问题,主要是两个地方导致你只能拿到首行就报错:

1. 错误的遍历对象

你现在直接循环soup.find_all('table')[2],其实遍历的是这个表格的所有直接子节点——这里面除了<tr>行标签,还有很多换行符这类NavigableString对象。这些字符串节点根本没有find_all方法,所以循环到它们的时候就会抛出错误,直接中断了后续遍历。

正确的做法是明确遍历表格里的所有<tr>标签,用.find_all('tr')来精准获取所有行元素。

2. 无效的异常处理

你写的except NavigableString:完全不对——NavigableString是BeautifulSoup里的节点类型,不是异常类,根本捕获不到实际的错误。实际可能遇到的异常是:当某行的<td>数量不足3个时的IndexError,或者调用非节点对象的text属性时的AttributeError。

修正后的完整代码

import requests
from bs4 import BeautifulSoup

r = requests.get('http://libgen.io/search.php?mode=last')
soup = BeautifulSoup(r.text, 'html.parser')

# 先定位目标表格,再获取所有<tr>行
target_table = soup.find_all('table')[2]
for tr in target_table.find_all('tr'):
    try:
        tds = tr.find_all('td')
        # 确保有至少3个<td>再访问索引,避免越界
        if len(tds) >= 3:
            # 用strip()清理文本里的多余空格和换行
            print(tds[0].text.strip(), tds[1].text.strip(), tds[2].text.strip())
    except (IndexError, AttributeError) as e:
        # 可选:打印错误信息用于调试
        # print(f"处理行出错: {e}")
        pass

这样修改后,就能遍历表格里的所有有效行,不会中途报错了。另外加了strip()是为了清理文本里的多余空格和换行,让输出更整洁。

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

相关产品推荐
方舟 Agent Plan

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

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