港交所沪深港通月度历史数据提取失败,求有效解决方案
港交所沪深港通月度历史数据提取修正方案
你定位到的JS数据链接没问题,但问题出在文件格式上——它不是纯JSON,而是JavaScript变量赋值语句(开头是var data_tab_monthly_202302e = ,结尾是;),直接用json.loads解析会报错,因为不符合JSON语法规范。
修正步骤:
- 获取文件内容后,剥离变量定义的外壳,提取内部的纯JSON结构
- 对提取后的JSON字符串进行解析
- 按原逻辑整理成DataFrame
修正后的代码:
import pandas as pd import urllib.request import json url = 'https://www.hkex.com.hk/eng/csm/MonthlyStat/data_tab_monthly_202302e.js' with urllib.request.urlopen(url) as r: # 读取并解码文件内容 js_content = r.read().decode('utf-8') # 剥离JS变量定义,提取中间的JSON部分 json_str = js_content.split('var data_tab_monthly_202302e = ')[1].rstrip(';') # 解析JSON数据 data = json.loads(json_str) # 后续数据整理逻辑和原代码一致 df = pd.DataFrame(data['tables'][0]['body']) columns = [item['text'] for item in data['tables'][0]['header']] row_count = max(df['row']) new_df = pd.DataFrame(df.text.values.reshape((row_count, -1)), columns=columns) # 查看提取结果 print(new_df.head())
补充说明:
如果要提取其他月份的数据,只需修改URL中的日期段(比如202302改成目标年月),同时调整split方法里的变量名(对应月份的变量格式为data_tab_monthly_YYYYMMe),确保剥离外壳的逻辑匹配即可。
内容的提问来源于stack exchange,提问作者Patrick Chau
相关产品推荐
相关产品推荐

