使用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])
关键代码解释:
- 优化教授信息提取:用
stripped_strings直接获取h3里所有干净的文本片段,不用手动处理<br>、换行符和制表符,逻辑更简洁可靠。 - 定位分隔行:遍历表格所有行,把只有一个
<td>的行的索引存起来,这些索引就是每个教授日程区块的「分界点」。 - 分组提取日程:根据分界点把表格行切成一个个区块,每个区块对应一位教授的日程,然后遍历区块里的行,提取每个行的日期/时段和细节信息。
- 整合数据:把教授、房间和对应的日程打包成字典,方便后续存储或进一步处理。
如果需要拆分日期和时段,直接对day_time字符串做拆分处理就行,比如用split()方法分割空格或者特定符号~
备注:内容来源于stack exchange,提问作者AdrianIT
相关产品推荐
相关产品推荐

