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

如何定位无特殊标识的td标签提取CBA活动日期?

解决方法

要精准获取日期并和活动名称、地点对应,核心思路是按表格行(<tr>)遍历——日期、名称、地点属于同一活动条目,必然在同一行内。这样既能精准定位日期,还能保证三组数据的顺序完全匹配。

修改后的完整代码

import pandas as pd
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq

cba_url = "https://www.cbabbq.com/events.cfm"
client = uReq(cba_url)
page_html = client.read()
client.close()  # 记得关闭网络连接
page_soup = soup(page_html, features='lxml')

# 存储所有活动数据的列表
events_data = []

# 定位活动表格,跳过第一行表头,遍历所有活动行
event_rows = page_soup.find("table").find_all("tr")[1:]

for row in event_rows:
    tds = row.find_all("td")
    # 每行第一个td是日期,第二个是活动名称,第三个是地点
    event_date = tds[0].get_text(strip=True)
    event_name = tds[1].get_text(strip=True)
    event_location = tds[2].get_text(strip=True)
    
    events_data.append({
        "日期": event_date,
        "活动名称": event_name,
        "地点": event_location
    })

# 转换为DataFrame
df_events = pd.DataFrame(events_data)
print(df_events)

关键说明

  1. 按行遍历:通过find("table").find_all("tr")[1:]获取所有活动行,[1:]跳过表头行,确保只处理实际活动条目。
  2. 精准提取日期:同一行内的第一个<td>就是日期,无需依赖类名,直接通过索引定位即可。
  3. 数据对应:同一行内的三个数据天然属于同一活动,避免了单独提取th1/th2标签可能出现的顺序错位问题。
  4. 细节优化:用get_text(strip=True)自动去除文本前后的空格、换行符;新增client.close()释放网络连接,避免资源浪费。

备用方案(行结构变动时)

如果页面行结构有调整,也可以通过活动名称标签的兄弟元素定位日期:

cba_event_tags = page_soup.findAll("td", {"class":"th1"})
events_data = []

for event_tag in cba_event_tags:
    event_name = event_tag.get_text(strip=True)
    # 跳过空白节点,获取日期(活动名称td的前一个有效td)
    event_date = event_tag.previous_sibling.previous_sibling.get_text(strip=True)
    # 获取地点(活动名称td的后一个有效td)
    event_location = event_tag.next_sibling.next_sibling.get_text(strip=True)
    
    events_data.append({"日期": event_date, "活动名称": event_name, "地点": event_location})

df_events = pd.DataFrame(events_data)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:06:25