如何定位无特殊标识的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)
关键说明
- 按行遍历:通过
find("table").find_all("tr")[1:]获取所有活动行,[1:]跳过表头行,确保只处理实际活动条目。 - 精准提取日期:同一行内的第一个
<td>就是日期,无需依赖类名,直接通过索引定位即可。 - 数据对应:同一行内的三个数据天然属于同一活动,避免了单独提取
th1/th2标签可能出现的顺序错位问题。 - 细节优化:用
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
相关产品推荐
相关产品推荐

