使用bs4解析highshortinterest.com表格数据for循环无输出
问题根因
- 使用默认参数的
requests发起请求时,请求头自带的User-Agent会标识请求来源为Python爬虫程序,被网站反爬机制识别后,返回的页面源码中class为stocks的table标签是无内容的空标签,不存在浏览器开发者工具中看到的tbody、tr、td子节点,后续元素查找逻辑自然无返回。 - 浏览器开发者工具展示的是页面经过JS渲染、浏览器自动补全节点后的DOM结构,和requests直接拿到的原始HTML源码不一定完全一致:很多场景下浏览器会自动给table节点补全tbody层级,但原始源码里tr是直接挂载在table节点下的,显式查找tbody反而会匹配失败。
修正代码
from bs4 import BeautifulSoup import requests urlSI = "https://highshortinterest.com/" # 补充真实浏览器请求头,绕过基础反爬校验 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" } pageSI = requests.get(urlSI, headers=headers) soupSI = BeautifulSoup(pageSI.text, 'html.parser') stocks = soupSI.find('table', class_='stocks') # 跳过tbody层级直接查找所有行,适配原始源码结构 rows = stocks.find_all('tr') for row in rows: info = row.find_all('td') # 跳过表头、空行等td数量不足的无效行,避免索引报错 if len(info) < 6: continue company = info[0].text exchange = info[1].text si = info[2].text s_float = info[3].text outstd = info[4].text industry = info[5].text # 按需打印结果验证 print(company, exchange, si, s_float, outstd, industry)
补充说明
- 如果运行后仍存在解析异常,可以安装
lxml解析库,将BeautifulSoup初始化参数替换为BeautifulSoup(pageSI.text, 'lxml'),该解析器容错性更高。 - 定位元素过程中可以随时打印元素内容,确认请求实际返回的源码结构,不要完全依赖浏览器开发者工具展示的DOM层级做判断。
内容的提问来源于stack exchange,提问作者pythonpaul007
相关产品推荐
相关产品推荐

