如何从HTML元素提取href?Telegram bot开发HLTV赛事链接抓取问题
错误点说明
你原有代码的逻辑存在两处核心问题:
soup.find("div", class_="upcomingMatchesSection")返回的是单个父容器节点,直接遍历该节点拿到的是它的所有子元素(包含无用的文本节点、分隔标签),而非你需要的独立赛事卡片- 赛事详情的跳转链接没有存放在容器节点的属性中,是嵌套在每个
upcomingMatch类div内部的a标签的href属性里,原有取值逻辑完全错位
修正后可运行代码
elif message.text == "Matches": url_news = "https://www.hltv.org/matches" # 配置请求头避免被HLTV的反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" } response = requests.get(url_news, headers=headers) soup = BeautifulSoup(response.content, "html.parser") match_info = [] # 直接定位所有赛事卡片节点 match_items = soup.find_all("div", class_="upcomingMatch") for item in match_items: # 提取卡片内的跳转a标签 link_tag = item.find("a") if not link_tag or not link_tag.get("href"): continue # 拼接完整访问链接(HLTV默认返回相对路径) full_match_link = f"https://www.hltv.org{link_tag['href']}" # 可根据需要单独提取赛事名、对阵双方、时间字段,避免整段text冗余 match_title = item.get_text(strip=True) match_info.append({ "link": full_match_link, "title": match_title })
额外注意事项
- HLTV反爬机制严格,请求间隔建议控制在3秒以上,避免IP被封禁
- 若需要精准提取赛事信息,可单独定位
matchTeam、matchTime、eventName类节点提取对应文本,比直接获取整个卡片的文本更整洁 - 提取属性前务必做非空判断,避免遇到结构异常的节点时报错终止程序
内容的提问来源于stack exchange,提问作者makim
相关产品推荐
相关产品推荐

