如何提取Div内节点并关联父/子节点值且无重复?附Python代码
问题修正与实现方案
看起来你现在的代码和提供的HTML结构不匹配,而且存在遍历逻辑的问题(比如循环里用soup.find只会拿到第一个匹配项),我来帮你调整代码,实现关联父节点、提取每场比赛信息并去重的需求。
第一步:修正HTML结构
你提供的HTML有多余的闭合标签,先整理成正确的结构(假设这些.matches节点都在.league-data父节点下,对应你代码里的campeonato变量):
<div class="league-data"> <div class="matches"> <div class="conf">Brazil vs. Colombia</div> <div class="targetHour">08:00 pm</div> </div> <div class="matches"> <div class="conf">Chile vs. Argentina</div> <div class="targetHour">08:00 pm</div> </div> </div>
第二步:修正Python代码
你的原代码里在循环内部使用soup.find会导致始终只获取第一个匹配元素,而且和你提供的HTML里的.matches类不对应,下面是修正后的代码,实现关联父节点、提取信息并去重:
from bs4 import BeautifulSoup # 替换成你的实际HTML内容 html_content = ''' <div class="league-data"> <div class="matches"> <div class="conf">Brazil vs. Colombia</div> <div class="targetHour">08:00 pm</div> </div> <div class="matches"> <div class="conf">Chile vs. Argentina</div> <div class="targetHour">08:00 pm</div> </div> <!-- 模拟重复的比赛,测试去重 --> <div class="matches"> <div class="conf">Brazil vs. Colombia</div> <div class="targetHour">08:00 pm</div> </div> </div> ''' soup = BeautifulSoup(html_content, 'html.parser') # 使用集合自动去重 unique_results = set() # 遍历每个联赛数据节点 for league_node in soup.find_all('div', class_='league-data'): # 获取父节点(联赛)的文本,若没有可自定义标识 campeonato = league_node.text.strip() if league_node.text.strip() else "Unknown League" # 遍历当前联赛下的所有比赛节点 for match_node in league_node.find_all('div', class_='matches'): # 提取对阵信息和时间 match_conf = match_node.find('div', class_='conf').text.strip() match_hour = match_node.find('div', class_='targetHour').text.strip() # 组合成关联父节点的字符串,加入集合去重 result_line = f"{campeonato}|{match_conf}|{match_hour}" unique_results.add(result_line) # 输出去重后的结果 for line in unique_results: print(line)
关键改进点
- 关联父节点:通过
league_node.find_all确保只遍历当前联赛节点下的比赛,而不是全局查找,保证父节点和子节点的对应关系。 - 自动去重:使用Python的
set集合存储结果,自动过滤重复的比赛信息。 - 文本清理:用
.strip()去除文本中的多余空格和换行,让输出更整洁。 - 容错处理:如果联赛节点没有文本,默认使用"Unknown League"作为标识,避免空值问题。
内容的提问来源于stack exchange,提问作者Fabiano Carvalho
相关产品推荐
相关产品推荐

