Programmation avec pandas read_html

Fermé
ElGringo - Modifié le 5 déc. 2022 à 10:16
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 5 déc. 2022 à 11:00

Bonjour,

J'essaie de charger les infos de ce document html avec pandas.

#lecture et accès à l'url

"https://www.sec.gov/Archives/edgar/data/1652044/000165204422000090/goog-20220930.htm"
[{"metadata":{"scrolled":true,"trusted":true},"id":"0a690924","cell_type":"code","source":"\n\nSelectedcompany='Alphabet Inc.'\nSelectedreport='10-Q'\n\ncsv=pd.read_csv('C:/Users/Laurent/Desktop/SEC_Files/2022-QTR4.tsv',sep='\\t',lineterminator='\\r',names=None)\ncsv.columns.values[0]='Item'\ncompanyreport=csv[(csv['Item'].str.contains(Selectedcompany))&(csv['Item'].str.contains(Selectedreport))]\nFiling=companyreport['Item'].str.split('|')\nFiling=Filing.to_list()\n\nfor item in Filing[0]:\n    if 'html' in item:\n        report=item\nurl='https://www.sec.gov/Archives/'+report\n\nmy_header = { \"User-Agent\": \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36\", \"X-Requested-With\": \"XMLHttpRequest\" }\n\nhtml_page_text = requests.get(url, headers=my_header)\n\n\ndfTables = pd.read_html(html_page_text.text);\ndocument_index=dfTables[0].dropna()\ndocument_name=document_index[document_index['Description'].str.contains(Selectedreport)]\ndocument_name=document_name['Document'].str.split(' ')\ndocument_name=document_name[0][0]\nreport=report.replace('-','').replace('index.html','')\nurl='https://www.sec.gov/Archives/'+report+'/'+document_name\nurl\n\n        \n","execution_count":84,"outputs":[{"output_type":"execute_result","execution_count":84,"data":{"text/plain":"'https://www.sec.gov/Archives/edgar/data/1652044/000165204422000090/goog-20220930.htm'"},"metadata":{}}]}]

html_page_bilan = requests.get(url, headers=my_header)
df = pd.read_html(html_page_bilan.text)
   

    for item in df:  #pour chaque dataframe
    BS= (item[0].str.contains('assets')|item[0].str.contains('Retained')) #lorsque dans la première colonne onn trouve un des termes 'assets' ou 'retained'
    if BS.any(): # C'est vrai
    Balance_Sheet=item #alors le dataframe est item
     Balance_Sheet
A voir également:

1 réponse

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié le 5 déc. 2022 à 11:01

Bonjour

Il y a beaucoup de choses qui ne vont pas dans ton script.

  • l3-l4: Tu n'affectes ni l'URL ni le header dans des variables correspondantes, or tu les utilises pour faire .
  • l5: les variables url et headers ne sont pas déclarées.
  • l6: il manque import requests
  • l7: il manque import pandas as pd. De plus, pandas.read_html s'attend une table HTML, pas une page entière. Il faudrait donc extraire de html_page_bilan chacune des tables qui t'intéressent. Pour cela tu peux utiliser BeautifulSoup.
  • l10-l14: le code n'est pas indenté, or en python cela est indispensable de le faire correctement pour que l'interpréteur python comprenne la structure de ton programme.
  • l14: cette ligne seule ne sert à rien, peut être voulais-tu écrire print(Balance_Sheet) ?

Je vais délibérément ignorer la partie requests / headers (car sans passer les bons headers tu ne récupères pas le contenu intégral de la page, donc la partie qui contient les tables) et me focaliser dans ce qui suit sur read_html puisque c'est sur ça que porte la discussion.

from bs4 import BeautifulSoup
import pandas as pd
from pprint import pprint

html_data = """<html>
<body>
<table>
    <tr>    
        <td>1</td>
        <td>11</td>
    </tr>   
    <tr>    
        <td>111</td>
        <td>1111</td>
    </tr>   
</table>

<table>
    <tr>    
        <td>2</td>
        <td>22</td>
    </tr>   
    <tr>    
        <td>222</td>
        <td>2222</td>
    </tr>   
</table>
</body>
</html>"""

soup = BeautifulSoup(html_data)
dfs = list()
for table in soup.find_all("table"):
    df = pd.read_html(str(table))
    dfs.append(df)

pprint(dfs)

Résultat :

[[     0     1
0    1    11
1  111  1111],
 [     0     1
0    2    22
1  222  2222]]

Bonne chance 

0