You need to enable JavaScript to run this app. 使用Python BeautifulSoup爬取时无法定位同class重复div问题
优惠活动
大模型
产品
解决方案
定价
更多

使用Python BeautifulSoup爬取时无法定位同class重复div问题

重复class属性div的定位方案
  • 核心问题根源:使用soup.find()匹配同class元素时,仅会返回页面中第一个符合class条件的节点,因此无法定位到藏有目标数据的第二个同class div;硬回溯父节点的操作会因为页面层级动态变动直接返回None,不属于高稳定性的定位思路
  • 正确定位步骤:
    1. 用soup.find_all()替换原来的soup.find(),一次性获取页面上所有class="livewire-container"的div节点,存为列表结构
    2. 从列表中筛选目标div,两种筛选方式任选:
      • 固定索引取值:先遍历打印两个节点的文本内容,确认目标数据所在的列表下标,比如目标div在列表第二位就直接取containers[1]
      • 内容特征校验:遍历每个节点,判断节点文本中是否存在「GRE」「GMAT」这类目标数据独有关键词,匹配到的即为需要的容器,这种方式不受列表顺序变动影响,容错性更高
可直接适配的爬取代码
import requests
from bs4 import BeautifulSoup

# 配置请求头模拟浏览器访问,避免被网站反爬拦截
request_headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}
url = 'https://www.clearadmit.com/livewire/'
page = requests.get(url, headers=request_headers)
soup = BeautifulSoup(page.content, 'html.parser')

# 获取所有同class的容器节点
all_livewire_containers = soup.find_all('div', class_='livewire-container')
target_container = None
# 按内容特征筛选目标容器
for container in all_livewire_containers:
    if 'GRE' in container.get_text() and 'GMAT' in container.get_text():
        target_container = container
        break

# 从目标容器中逐条目提取需要的四个字段
extracted_data = []
# 按页面实际的列表选择器定位每一条录取记录,根据实际结构调整类名即可
for record in target_container.select('div.livewire-row'):
    data_row = {
        'school_name': record.select_one('div.school-name').get_text(strip=True),
        'admission_status': record.select_one('div.status-tag').get_text(strip=True),
        'gre_score': record.select_one('span.gre-score').get_text(strip=True) if record.select_one('span.gre-score') else '未公示',
        'gmat_score': record.select_one('span.gmat-score').get_text(strip=True) if record.select_one('span.gmat-score') else '未公示'
    }
    extracted_data.append(data_row)
实操避坑提示
  • 不要执着于回溯父节点定位子元素:网站后续更新页面结构时,父节点的层级、class属性都可能变动,基于内容特征、目标元素自身class的定位逻辑,维护成本更低
  • 如果代码返回None,优先校验接口请求状态:如果page.status_code返回403/401,说明是被反爬拦截而非定位逻辑错误,补全请求头、对应cookie即可解决
  • class匹配可以直接用class_='类名'的写法,比手写attrs={'class':'类名'}更简洁,也不会触发Python关键字冲突

内容的提问来源于stack exchange,提问作者Aytida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 20:15:04