使用BeautifulSoup爬取多模板多URL时出现Series真值歧义报错
错误原因
报错核心是你直接用if page_url_df['template'] == 1做分支判断:
page_url_df['template']是pandas Series对象,和1做相等比较后返回的是一组布尔值组成的Series,不是单个True/False- Python的if语句只能接收单个布尔值作为判断条件,无法直接判定一整组布尔值的真假,因此抛出
The truth value of a Series is ambiguous的错误 - 原逻辑还存在设计缺陷:分支判断写在循环外层,会导致要么所有URL都走模板1解析规则,要么全走模板2规则,根本无法实现两种模板混合匹配的需求
修复方案
逐行遍历DataFrame,读取每一行对应的URL和模板编号,针对单个URL的模板类型选择对应解析逻辑即可,修复后的完整代码如下:
import requests from bs4 import BeautifulSoup import pandas as pd page_url1 = 'https://www.vet.upenn.edu/research/centers-laboratories/research-laboratory/research-laboratory/anguera-laboratory' page_url2 = 'https://www.med.upenn.edu/apps/faculty/index.php/g20001100/p8866286' page_url_lst = {'url': [page_url1, page_url2], 'template': [1,2]} page_url_df = pd.DataFrame(page_url_lst) data = [] # 逐行遍历数据集,匹配每条URL对应的模板类型 for _, row in page_url_df.iterrows(): current_url = row['url'] current_template = row['template'] if current_template == 1: # 模板1解析逻辑 r = requests.get(current_url, timeout=10) soup = BeautifulSoup(r.text, 'lxml') for e in soup.select('#tabs-publications em'): data.append({ 'author':e.previous.get_text(strip=True)[:-1], 'title':e.get_text(strip=True), 'journal':e.next_sibling.get_text(strip=True), 'source': current_url }) else: # 模板2解析逻辑 r = requests.get(current_url, timeout=10) soup = BeautifulSoup(r.text, 'lxml') for a in soup.find_all('span',{'class':'fac_citation'}): data.append({ 'author':a.find('b').get_text(), 'title':a.find('i').get_text(strip=True), 'journal':a.find('i').next_sibling.get_text(strip=True), 'source': current_url }) # 如需校验结果可转成DataFrame输出 # result_df = pd.DataFrame(data) # print(result_df)
关键修改点
- 移除了对整个Series的直接布尔判断,改用
iterrows()逐行读取单条记录的模板编号,单值判断不会出现真值歧义 - 将两套解析逻辑移入逐行循环内部,每处理一个URL就匹配对应模板的解析规则,支持两种模板的URL混合爬取
- 给requests请求增加了
timeout参数,避免请求无响应时程序无限挂起
内容的提问来源于stack exchange,提问作者mangarapaul
相关产品推荐
相关产品推荐

