使用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
相关产品推荐
相关产品推荐

