Files
MoFin/venv/lib/python3.12/site-packages/akshare/fund/fund_fee_em.py
T
知微 fa45d8aa5f fix: 小果地址统一node122(兼容LAN+EasyTier)
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
  Privoxy对node122:18003返回500,直连正常
2026-06-30 02:56:35 +08:00

168 lines
7.0 KiB
Python

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2025/12/22 17:00
Desc: 天天基金-基金档案
https://fundf10.eastmoney.com/jjfl_015641.html
"""
import re
from io import StringIO
import pandas as pd
import requests
from bs4 import BeautifulSoup
def fund_fee_em(symbol: str = "015641", indicator: str = "认购费率") -> pd.DataFrame:
"""
天天基金-基金档案-购买信息
https://fundf10.eastmoney.com/jjfl_015641.html
:param symbol: 基金代码
:type symbol: str
:param indicator: choice of {"交易状态", "申购与赎回金额", "交易确认日", "运作费用", "认购费率(前端)", "认购费率(后端)","申购费率(前端)", "赎回费率"}
:type indicator: str
:return: 交易规则
:rtype: pandas.DataFrame
"""
url = f"https://fundf10.eastmoney.com/jjfl_{symbol}.html"
r = requests.get(url)
soup = BeautifulSoup(r.text, features="html.parser")
tables_dict = {}
title_elements = soup.find_all(name="h4", class_="t")
for title_elem in title_elements:
title_text = title_elem.get_text(strip=True)
title_text = re.sub(r"\s+", " ", title_text).strip()
if title_text == "申购与赎回金额":
next_table = title_elem.find_all_next("table")[0]
next_next_table = title_elem.find_all_next("table")[1]
table_html = str(next_table)
next_table_html = str(next_next_table)
df_1 = pd.read_html(StringIO(table_html))[0]
df_2 = pd.read_html(StringIO(next_table_html))[0]
df = pd.concat(objs=[df_1, df_2], ignore_index=True)
tables_dict[title_text] = df
continue
else:
next_table = title_elem.find_next("table")
if next_table:
try:
# 将表格转换为HTML字符串,然后使用pd.read_html读取
table_html = str(next_table)
df = pd.read_html(StringIO(table_html))[0]
tables_dict[title_text] = df
except Exception as e:
print("Error:", e)
continue
if indicator == "交易状态":
temp_df = tables_dict[indicator]
elif indicator == "申购与赎回金额":
temp_df = tables_dict[indicator]
elif indicator == "交易确认日":
temp_df = tables_dict[indicator]
elif indicator == "运作费用":
temp_df = tables_dict[indicator]
elif indicator == "认购费率(后端)":
temp_df = tables_dict[indicator]
elif indicator == "认购费率(前端)":
temp_df = tables_dict[indicator]
temp_df[["原费率", "天天基金优惠费率"]] = temp_df[
"原费率|天天基金优惠费率"
].str.split("|", expand=True)
del temp_df["原费率|天天基金优惠费率"]
temp_df.loc[3, "天天基金优惠费率"] = temp_df.loc[3, "原费率"]
temp_df["原费率"] = temp_df["原费率"].str.strip()
temp_df["天天基金优惠费率"] = temp_df["天天基金优惠费率"].str.strip()
elif indicator == "申购费率(前端)":
temp_df = tables_dict[indicator]
if "原费率|天天基金优惠费率 银行卡购买|活期宝购买" not in temp_df.columns:
# assert temp_df.columns.tolist() == ["适用金额", "适用期限", "费率"]
return temp_df
splited = temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"].str.split(
"|", expand=True
)
if splited.shape[1] == 1:
temp_df.rename(
columns={"原费率|天天基金优惠费率 银行卡购买|活期宝购买": "原费率"},
inplace=True,
)
temp_df["天天基金优惠费率-银行卡购买"] = temp_df["原费率"]
temp_df["天天基金优惠费率-活期宝购买"] = temp_df["原费率"]
else:
temp_df[
["原费率", "天天基金优惠费率-银行卡购买", "天天基金优惠费率-活期宝购买"]
] = splited
temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
"天天基金优惠费率-银行卡购买"
].fillna(temp_df["原费率"])
temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
"天天基金优惠费率-活期宝购买"
].fillna(temp_df["原费率"])
del temp_df["原费率|天天基金优惠费率 银行卡购买|活期宝购买"]
temp_df["原费率"] = temp_df["原费率"].str.strip()
temp_df["天天基金优惠费率-银行卡购买"] = temp_df[
"天天基金优惠费率-银行卡购买"
].str.strip()
temp_df["天天基金优惠费率-活期宝购买"] = temp_df[
"天天基金优惠费率-活期宝购买"
].str.strip()
elif indicator in ("赎回费率", "赎回费率(前端)", "赎回费率(后端)"):
temp_df = tables_dict[indicator]
if "原费率|天天基金优惠费率" in temp_df.columns:
temp_df[["原费率", "天天基金优惠费率"]] = temp_df[
"原费率|天天基金优惠费率"
].str.split("|", expand=True)
del temp_df["原费率|天天基金优惠费率"]
else:
temp_df = pd.DataFrame([])
return temp_df
if __name__ == "__main__":
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="交易状态")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="申购与赎回金额")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="交易确认日")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="运作费用")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="认购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="019005", indicator="申购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="000011", indicator="赎回费率")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="018403", indicator="赎回费率")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="100035", indicator="赎回费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="022364", indicator="申购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="022365", indicator="申购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="006030", indicator="申购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="022568", indicator="申购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="960029", indicator="申购费率(前端)")
print(fund_fee_em_df)
fund_fee_em_df = fund_fee_em(symbol="000011", indicator="认购费率(后端)")
print(fund_fee_em_df)