使用BeautifulSoup抓取tr标签数据时select返回空数组的问题求助
问题排查与解决方案
核心原因
当前代码匹配不到结果的核心原因是选择器和目标页面的DOM结构不匹配:
- 你参考的爬取方案,针对的是表格行自带
data-row自定义属性的站点,但当前要爬的leagues页面结构和参考案例的页面差异极大,表格行没有设置这类自定义属性,匹配逻辑自然返回空数组。 - 可通过打印
html_text前2000个字符快速排查:如果返回内容和浏览器打开的页面一致,就确认是选择器写错;如果返回的是验证页/空白内容,再排查反爬拦截问题。
修正后可运行的代码
from bs4 import BeautifulSoup import requests # 加基础请求头模拟浏览器访问,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } html_text = requests.get('https://www.basketball-reference.com/leagues/', headers=headers).text soup = BeautifulSoup(html_text, 'lxml') # 定位到目标数据表格 target_table = soup.select_one('#league_leagues') # 取表格tbody下的所有数据行,排除表头 rows = target_table.select('tbody tr') print(f"共抓取到 {len(rows)} 条有效行数据") # 打印前3条行的文本做验证 for row in rows[:3]: print(row.get_text(strip=True))
新手爬取通用注意事项
- 不要直接套用其他站点的爬取代码,每个网站的DOM结构是独立设计的,优先在浏览器开发者工具(按F12打开)里核对目标元素的实际属性、所属父容器,再写对应选择器。
- 如果需要过滤掉表格里的无数据分组标题行,可以加属性判断:只保留带
data-stat属性的tr,正常数据行的每个单元格都会带对应统计项的标识。 - 所有请求尽量带上基础的
User-Agent请求头,避免被站点识别为爬虫直接返回空内容。
内容的提问来源于stack exchange,提问作者The_elevator
相关产品推荐
相关产品推荐

