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

BeautifulSoup爬取class为score-result的div内容无输出如何解决

错误点排查

  • 标签选择错误:原代码查找table标签,但目标容器是class="score-result"的div标签,findAll传入的标签参数匹配错误,导致根本找不到对应元素
  • 内容获取逻辑错误:link.get('score-result')是获取元素的score-result自定义属性值,你需要提取的是元素内部的文本与子节点内容,该方法完全用错
  • 自增语法错误:hall=+1等价于直接给hall赋值为1,正确的自增语法为hall += 1,period的自增存在同样问题
  • 自增位置错误:循环变量的自增逻辑放在了for循环内部,一旦页面没有匹配到对应元素,循环变量永远不会更新,会直接陷入死循环,需要放到while循环内部、for循环外部的位置

修正后代码

import requests
from bs4 import BeautifulSoup

def trade_spider(max_hall,max_period):
    hall = 2
    period = 1
    # 补充period边界判断,避免越界
    while hall <= max_hall and period <= max_period:
        url = f'https://tabletennis.setkacup.com/en/schedule?date=2021-08-27&hall={hall}&period={period}'
        source_code = requests.get(url)
        plain_text = source_code.text
        soup = BeautifulSoup(plain_text, "html.parser")
        # 正确查找class为score-result的div标签
        for score_div in soup.find_all('div', {'class': 'score-result'}):
            # 提取外层div的非空直接文本,即选手名和姓氏
            text_contents = [t.strip() for t in score_div.contents if isinstance(t, str) and t.strip()]
            player_first_name = text_contents[0]
            player_last_name = text_contents[1]
            # 提取内层div的比分内容
            score = score_div.find('div').text.strip()
            print(f"选手名:{player_first_name},姓氏:{player_last_name},比分:{score}")
        # 循环变量自增放到while层,避免死循环
        hall += 1
        period += 1

提取逻辑说明

div.score-result的内容包含三部分:直接文本节点的选手名、直接文本节点的选手姓氏、子div节点的比分。通过contents属性遍历所有子节点,过滤出字符串类型的非空内容就能拿到姓名,再查找内层div就能拿到比分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:00:01