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

