使用BeautifulSoup爬取页面所有'Kentucky'文本仅返回3条结果如何解决
问题说明
爬取NBA球员页面所有'Kentucky'文本时,运行以下代码仅返回3条匹配结果,远低于实际页面出现次数:
from bs4 import BeautifulSoup import requests url = 'https://www.nba.com/players' result = requests.get(url) doc = BeautifulSoup(result.text, 'lxml') college = doc.find_all(text='Kentucky') print(college)
核心原因
- 页面数据动态加载:
requests发起的普通请求只能拿到页面首次返回的静态HTML骨架,仅包含首屏少量球员信息。剩余绝大多数球员数据是页面加载完成后,浏览器通过异步接口拉取、再用JS渲染到页面上的,这部分内容根本不在requests获取到的原始响应文本里,自然匹配不到。 - 匹配规则过于严格:
text='Kentucky'是完全相等匹配,只要目标文本前后带空格、换行、特殊空白字符,就会匹配失败。
解决方法
方法1:直接调用后端数据接口(推荐,效率最高)
按F12打开浏览器开发者工具,切换到「网络」面板,筛选Fetch/XHR类型请求,滚动页面加载球员列表时,就能找到返回全量球员数据的接口。直接用requests请求这个接口拿到结构化JSON数据,遍历筛选院校字段为Kentucky的条目即可,不需要解析HTML,稳定性和运行效率都更高。
方法2:获取完整渲染后的页面源码再解析
如果不想找接口,可以用支持JS渲染的工具(比如selenium、requests-html)模拟浏览器加载页面,等所有球员数据全部渲染完成后,再提取完整页面源码交给BeautifulSoup解析。
同时把精确匹配改成正则模糊匹配,兼容文本前后的空白字符,匹配逻辑参考:
import re # page_source为JS渲染完成后拿到的完整页面源码 doc = BeautifulSoup(page_source, 'lxml') # 匹配前后带任意空白字符的Kentucky,避免漏判 match_list = doc.find_all(text=re.compile(r'\s*Kentucky\s*')) print(f"匹配到的条目总数:{len(match_list)}")
内容的提问来源于stack exchange,提问作者Morman D Singles
相关产品推荐
相关产品推荐

