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

使用BeautifulSoup抓取网页表格时,如何区分无明显标识的行并提取对应工作日/日期与时段信息?

使用BeautifulSoup抓取网页表格时,如何区分无明显标识的行并提取对应工作日/日期与时段信息?

嘿,我来帮你搞定这个爬虫问题!你已经迈出了很好的第一步,抓取到了教授和房间信息,现在要处理的表格里那个单<td>的<tr>行,其实就是天然的「分隔标记」——它把每个教授对应的时间区块清晰地分开了,我们可以利用这一点来分组提取数据。

先理清楚核心思路:

那个只有一个<td>的短行,是每个教授时间安排的起始分隔符。我们可以先定位所有这些分隔行的位置,然后把表格里的行按分隔行切分成一个个独立的区块,每个区块对应一位教授的日程,这样就能把教授、房间和对应的时间信息一一对应起来了。

优化后的完整代码示例:

import requests
from bs4 import BeautifulSoup

# 发起请求并解析页面
url = "https://we.umg.edu.pl/ktm/konsultacje"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')

# 第一步:抓取教授和房间信息(优化原有逻辑)
professors = []
rooms = []
for h3 in soup.find_all('h3'):
    # 直接提取h3里所有非空白的文本片段,不用手动处理换行和标签
    text_parts = [part.strip() for part in h3.stripped_strings if part.strip()]
    prof_name = []
    room = None
    for part in text_parts:
        if 'pok.' in part:
            room = part
        else:
            prof_name.append(part)
    professors.append(' '.join(prof_name))
    rooms.append(room)

# 第二步:处理表格里的时间信息
table = soup.find('table')
rows = table.find_all('tr')

# 找到所有分隔行的索引(就是只有一个td的行)
separator_indices = []
for idx, row in enumerate(rows):
    tds = row.find_all('td')
    if len(tds) == 1:
        separator_indices.append(idx)

# 第三步:给每个教授配对对应的日程
professor_schedules = []
for i in range(len(separator_indices)):
    # 确定当前教授日程的起始和结束行索引
    start_idx = separator_indices[i] + 1
    if i < len(separator_indices) - 1:
        end_idx = separator_indices[i+1]
    else:
        end_idx = len(rows)  # 最后一个教授的日程到表格末尾
    
    # 提取当前教授的所有日程行
    schedule = []
    for row in rows[start_idx:end_idx]:
        tds = row.find_all('td')
        if len(tds) != 2:
            continue  # 跳过无效行(比如空白行)
        
        # 提取日期/工作日+时段,以及对应的细节
        day_time = tds[0].get_text(strip=True)
        details = tds[1].get_text(strip=True)
        schedule.append({
            'day_time': day_time,
            'details': details
        })
    
    # 把教授、房间和日程整合到一起
    professor_schedules.append({
        'professor': professors[i],
        'room': rooms[i],
        'schedule': schedule
    })

# 测试输出第一个教授的信息看看效果
print(professor_schedules[0])

关键代码解释:

  1. 优化教授信息提取:用stripped_strings直接获取h3里所有干净的文本片段,不用手动处理<br>、换行符和制表符,逻辑更简洁可靠。
  2. 定位分隔行:遍历表格所有行,把只有一个<td>的行的索引存起来,这些索引就是每个教授日程区块的「分界点」。
  3. 分组提取日程:根据分界点把表格行切成一个个区块,每个区块对应一位教授的日程,然后遍历区块里的行,提取每个行的日期/时段和细节信息。
  4. 整合数据:把教授、房间和对应的日程打包成字典,方便后续存储或进一步处理。

如果需要拆分日期和时段,直接对day_time字符串做拆分处理就行,比如用split()方法分割空格或者特定符号~

备注:内容来源于stack exchange,提问作者AdrianIT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:20:28