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
相关产品推荐
相关产品推荐

