Python嵌套循环中使用soup.find()时如何排除None类型?
解决网页爬取中NoneType属性错误的问题
我用嵌套循环做网页爬取,外层遍历页面链接,内层遍历文章ID,想获取标题和作者名。但现在的问题是,当在某个网页里查找不属于它的ID时,soup.find()会返回None,后续操作就会触发“NoneType没有find属性”的错误。比如链接https://www.aeaweb.org/issues/696对应ID10.1257/aer.20190668时没问题,但如果在第一个链接里查其他ID就会报错。
原代码如下:
for i in df2['links']: for j in dummy['id']: soup=BeautifulSoup(requests.get(i).content, "html.parser") results_j= soup.find(id=j) print(results_j)
核心解决思路
你的问题根源是嵌套循环把所有ID和所有页面做了无意义的匹配,完全没必要。正确的做法要么提前建立「页面链接」和「对应文章ID」的映射关系,要么在代码里增加判断,跳过无效的查找结果。
具体实现方法
方法1:提前构建链接与ID的对应字典(推荐)
如果你的df2和dummy里有能关联两者的字段(比如每个页面对应的期刊期号),先把它们整合成一个字典,键是页面链接,值是该页面包含的ID列表,从根源上保证每个ID只去它所属的页面查找:
# 假设df2和dummy有共同的关联字段(比如issue_num),构建链接与对应ID的映射 link_id_map = {} for idx, row in df2.iterrows(): link = row['links'] # 筛选出当前页面对应的所有ID related_ids = dummy[dummy['issue_num'] == row['issue_num']]['id'].tolist() link_id_map[link] = related_ids # 遍历映射字典,只在对应页面找对应ID for link, ids in link_id_map.items(): # 每个页面只请求一次,避免重复请求浪费资源 response = requests.get(link) soup = BeautifulSoup(response.content, "html.parser") for article_id in ids: results_j = soup.find(id=article_id) if results_j: # 额外加判断防止意外情况 # 这里根据实际HTML结构提取标题、作者 title = results_j.find(class_='article-title').text.strip() authors = results_j.find(class_='author-names').text.strip() print(f"标题:{title},作者:{authors}") else: print(f"页面{link}中未找到ID{article_id}")
方法2:增加None判断(快速补救)
如果暂时没法建立链接和ID的对应关系,最直接的补救是在获取results_j后先判断是否为None,再执行后续操作,同时把页面请求移到内层循环外,避免重复请求同一个页面:
for i in df2['links']: # 每个页面只请求一次,移到内层循环外 response = requests.get(i) soup = BeautifulSoup(response.content, "html.parser") for j in dummy['id']: results_j = soup.find(id=j) if results_j is not None: # 先确认找到元素再操作 # 提取标题、作者的逻辑 title = results_j.find('h2').text.strip() authors = results_j.find(class_='author-list').text.strip() print(f"标题:{title},作者:{authors}") # 找不到就直接跳过,不会触发错误
内容的提问来源于stack exchange,提问作者econcoder
相关产品推荐
相关产品推荐

