0%

pandas处理html中的表格转换成json落库

hello 大家好我是Monday,今天给大家介绍下如何利用pandas处理html中的表格转换成json落库。

前言:

我们打开同花顺

http://q.10jqka.com.cn/thshy/detail/code/881172/

我们查看下网页源码发现时table表格的数据

这时候我们就可以使用pandas 的to_html 来处理

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import requests
import pandas as pd

headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Referer": "http://q.10jqka.com.cn/thshy/",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.62"
}
cookies = {
"__bid_n": "184ad366cf548da7ef4207",
"__utmz": "156575163.1669353336.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)",
"spversion": "20130314",
"Hm_lvt_78c58f01938e4d85eaf619eae71b4ed1": "1669265905,1669353299,1669606035,1669862136",
"__utma": "156575163.52013898.1669353336.1669353336.1669862146.2",
"__utmc": "156575163",
"log": "",
"Hm_lpvt_78c58f01938e4d85eaf619eae71b4ed1": "1669899435",
"historystock": "300054%7C*%7C300896%7C*%7CHK1398%7C*%7C002316",
"v": "AwZL9WAEmZnu4039huusLHExV_eNZ0ohHKt-hfAv8ikE86ipWPeaMew7zo7D"
}
url = "http://q.10jqka.com.cn/thshy/detail/code/881172/"
response = requests.get(url, headers=headers, cookies=cookies, verify=False)

response = requests.get(url, headers=headers, cookies=cookies, verify=False)
text = response.text
df = pd.read_html(text)[0]
# 将df 转化成字典,获取列名
# ss = df.to_dict('dict')
# keys = []
# for k, v in ss.items():
# keys.append(k)

keys = df.columns.values # 直接获取列名
keys_repalce = {
"代码": "code",
"名称": "name"
}
df.columns = keys
# # 选取指定列 方式一
# select_cols = ['code', 'name']
# df = df[select_cols]
# # 选取指定列 方式二
# df.loc[:, ['code', 'name']]
df_list = []
df.rename(columns=keys_repalce, inplace=True) # 重新替换列的名字 {"标题" : "title"}
df["name"] = df["name"].map(lambda x: x.replace(" ", "").strip()) # 处理列数据
for i in df.index.values: # loc为按列名索引 iloc 为按位置索引,使用的是 [[行号], [列名]]
df_line = df.loc[i, ['code', 'name']].to_dict() # 选取指定列,将每一行转换成字典后添加到列表
df_list.append(df_line)
print(df_list)

处理结果如下:

1
[{'code': 300054, 'name': '鼎龙股份'}, {'code': 688019, 'name': '安集科技'}, {'code': 301319, 'name': '唯特偶'}, {'code': 688359, 'name': '三孚新科'}, {'code': 300285, 'name': '国瓷材料'}, {'code': 300481, 'name': '濮阳惠成'}, {'code': 688106, 'name': '金宏气体'}, {'code': 300684, 'name': '中石科技'}, {'code': 300655, 'name': '晶瑞电材'}, {'code': 300398, 'name': '飞凯材料'}, {'code': 300236, 'name': '上海新阳'}, {'code': 2741, 'name': '光华科技'}, {'code': 688268, 'name': '华特气体'}, {'code': 603002, 'name': '宏昌电子'}, {'code': 300346, 'name': '南大光电'}, {'code': 300429, 'name': '强力新材'}, {'code': 300576, 'name': '容大感光'}, {'code': 688550, 'name': '瑞联新材'}, {'code': 300537, 'name': '广信材料'}, {'code': 688150, 'name': '莱特光电'}]

正常批量insert语句 df_list 就可以了(仅是小编的自己的习惯,转换成字典追加列表在批量入库)

(1)to_dict

1
2
3
4
5
6
7
df_list = []
df.rename(columns=keys_repalce, inplace=True) # 重新替换列的名字 {"标题" : "title"}
df["name"] = df["name"].map(lambda x: x.replace(" ", "").strip()) # 处理列数据
for i in df.index.values: # loc为按列名索引 iloc 为按位置索引,使用的是 [[行号], [列名]]
df_line = df.loc[i, ['code', 'name']].to_dict() # 选取指定列,将每一行转换成字典后添加到列表
df_list.append(df_line)
print(df_list)

(2)to_sql

1
2
3
4
5
6
7
8
from sqlalchemy import create_engine
engine_ts = create_engine('mysql://xxx:xxxx)@xxxx:xxxx/xx?charset=utf8&use_unicode=1')

# 此处省略处理代码,直接看上部分代码重复
df.rename(columns=keys_repalce, inplace=True) # 重新替换列的名字 {"标题" : "title"}
df["name"] = df["name"].map(lambda x: x.replace(" ", "").strip()) # 处理列数据

df.to_sql('table_name', engine_ts, index=False, if_exists='append', chunksize=5000)# 批量入库

(3)to_excel

1
2
3
4
5
6
7
8
9
df_list = []
df.rename(columns=keys_repalce, inplace=True) # 重新替换列的名字 {"标题" : "title"}
df["name"] = df["name"].map(lambda x: x.replace(" ", "").strip()) # 处理列数据
for i in df.index.values: # loc为按列名索引 iloc 为按位置索引,使用的是 [[行号], [列名]]
df_line = df.loc[i, ['code', 'name']].to_dict() # 选取指定列,将每一行转换成字典后添加到列表
df_list.append(df_line)
print(df_list)
df = pd.DataFrame(df_list,columns=['code','name'])
df.to_excel('stocks.xlsx',index=False)

结束语

​ 今天的分享就到这里了,欢迎大家关注微信公众号”菜鸟童靴