为何使用BeautifulSoup爬取URL时soup.findAll返回空列表[]?
问题原因及解决办法
可能的原因1:目标内容由JavaScript动态渲染
你用requests获取的是服务器返回的初始HTML,而目标的.section内容可能是页面加载后通过JavaScript异步请求数据渲染出来的,初始HTML里根本没有这个元素,所以BeautifulSoup找不到。
解决办法:
- 打开浏览器开发者工具(F12),切换到Network标签页,刷新页面,筛选XHR/Fetch请求,查找返回包含"HOT TIPS"相关数据的接口。找到后直接请求这个接口,就能拿到结构化数据(通常是JSON格式),不需要解析HTML。
- 比如你可以搜索接口里的关键词,比如"hotTips"或者直接看返回内容里的提示文本,找到对应的API地址后,用
requests请求该接口即可。
可能的原因2:反爬机制拦截了请求
网站可能识别出你的请求是爬虫,返回的内容不完整或者是假页面。你的headers只有User-Agent,可能不够。
解决办法:
- 补充更多请求头信息,从浏览器复制完整的请求头(包括
Accept、Accept-Language、Referer等),模拟真实浏览器请求:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3', 'Referer': 'https://www.barstoolsportsbook.com/', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1', }
- 另外可以尝试带上浏览器的cookies,先在浏览器访问该页面,复制cookies添加到
requests.get的cookies参数里。
可能的原因3:选择器不准确
目标元素的class可能有变化,或者你用的选择器没有考虑到嵌套结构,或者元素在iframe中。
解决办法:
- 先打印
html.text的内容,搜索是否存在class="section"或者"HOT TIPS"关键词,确认这些内容是否在返回的HTML里。 - 如果元素在iframe中,需要先找到iframe的src地址,请求该地址的内容再解析。
- 可以尝试用更精确的选择器,比如结合父元素或者其他属性:
# 结合data-v属性缩小筛选范围 data = soup.find_all('div', attrs={"class": "section", "data-v-50e01018": ""})
内容的提问来源于stack exchange,提问作者smitty_werben_jagerm
相关产品推荐
相关产品推荐

