Convertissez d'abord la chaîne de caractères en un BeautifulSoup
et .select('[data-append-csv]')
:
table = [x.extract() for x in soup.find_all(string=lambda text: isinstance(text, Comment)) if 'id="div_players_standard_batting"' in x][0]
[(a.find_previous('th').text,a.get('data-append-csv')) for a in BeautifulSoup(table).select('[data-append-csv]')]
Pour garantir une jointure correcte à vos données d'origine, essayez de récupérer également le rang au cas où il y aurait des lignes sans ces attributs et que la longueur des deux cadres de données serait différente :
(a.find_previous('th').text,a.get('data-append-csv'))
Vous pouvez maintenant créer votre cadre de données à partir de votre liste :
pd.DataFrame([(a.find_previous('th').text,a.get('data-append-csv')) for a in BeautifulSoup(table).select('[data-append-csv]')],columns=['Rk','data-append-csv'],dtype='object')
Exemple
Joignez vos données à votre cadre de données initial et vérifiez la dernière colonne :
from bs4 import BeautifulSoup
from bs4 import Comment
import pandas as pd
import requests
r = requests.get("https://www.baseball-reference.com/leagues/majors/2021-standard-batting.shtml")
soup = BeautifulSoup(r.text)
table = [x.extract() for x in soup.find_all(string=lambda text: isinstance(text, Comment)) if 'id="div_players_standard_batting"' in x][0]
### create and clean dataframe 1
df1 = pd.read_html(table)[0]
df1 = df1[(~df1.Rk.isna()) & (df1.Rk != 'Rk')]
df1.set_index('Rk', inplace=True)
### create and clean dataframe 2
df2 = pd.DataFrame([(a.find_previous('th').text,a.get('data-append-csv')) for a in BeautifulSoup(table).select('[data-append-csv]')],columns=['Rk','data-append-csv'],dtype='object')
df2.set_index('Rk', inplace=True)
### join both dataframe
df1.join(df2).reset_index()
Sortie
Rk
Nom
Âge
Tm
Lg
G
PA
AB
R
H
2B
3B
RH
RBI
SB
CS
BB
SO
BA
OBP
SLG
OPS
OPS+
TB
PIB
HBP
SH
SF
IBB
Résumé du poste
data-append-csv
0
1
Fernando Abad*
35
BAL
AL
2
0
0
0
0
0
0
0
0
0
0
0
0
nan
nan
nan
nan
nan
0
0
0
0
0
0
1
abadfe01
1
2
Cory Abbott
25
CCH
NL
8
3
3
0
1
0
0
0
0
0
0
0
1
0.333
0.333
0.333
0.667
81
1
0
0
0
0
0
/1H
abbotco01
2
3
Albert Abreu
25
NYY
AL
3
0
0
0
0
0
0
0
0
0
0
0
0
nan
nan
nan
nan
nan
0
0
0
0
0
0
1
abreual01
3
4
Bryan Abreu
24
HOU
AL
1
0
0
0
0
0
0
0
0
0
0
0
0
nan
nan
nan
nan
nan
0
0
0
0
0
0
1
abreubr01
4
5
José Abreu
34
CHW
AL
152
659
566
86
148
30
2
30
117
1
0
61
143
0.261
0.351
0.481
0.831
124
272
28
22
0
10
3
*3D/5
abreujo02
....