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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:55:25