2 votes

Essayer de gratter la table en utilisant Pandas à partir du résultat de Selenium

Je essaie de racler un tableau à partir d'un site web Javascript en utilisant Pandas. Pour ce faire, j'ai utilisé Selenium pour d'abord atteindre ma page désirée. Je suis capable d'imprimer le tableau au format texte (comme indiqué dans le script commenté), mais je veux aussi pouvoir avoir le tableau dans Pandas. Je joins mon script ci-dessous et j'espère que quelqu'un pourrait m'aider à résoudre cela.

import time
from selenium import webdriver
import pandas as pd

chrome_path = r"Chemin vers le pilote chrome"
driver = webdriver.Chrome(chrome_path)
url = 'http://www.bursamalaysia.com/market/securities/equities/prices/#/?
filter=BS02'

page = driver.get(url)
time.sleep(2)

driver.find_element_by_xpath('//*[@id="bursa_boards"]/option[2]').click()

driver.find_element_by_xpath('//*[@id="bursa_sectors"]/option[11]').click()
time.sleep(2)

driver.find_element_by_xpath('//*[@id="bm_equity_price_search"]').click()
time.sleep(5)

target = driver.find_elements_by_id('bm_equities_prices_table')
##for data in target:
##    print (data.text)

for data in target:
    dfs = pd.read_html(target,match = '+')
for df in dfs:
    print (df)  

En exécutant le script ci-dessus, j'obtiens l'erreur suivante :

Traceback (most recent call last):
  File "E:\Coding\Python\BS_Bursa Properties\Selenium_Pandas_Bursa Properties.py", line 29, in 
    dfs = pd.read_html(target,match = '+')
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\html.py", line 906, in read_html
    keep_default_na=keep_default_na)
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\site-packages\pandas\io\html.py", line 728, in _parse
    compiled_match = re.compile(match)  # you can pass a compiled regex here
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\re.py", line 233, in compile
    return _compile(pattern, flags)
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\re.py", line 301, in _compile
    p = sre_compile.compile(pattern, flags)
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\sre_compile.py", line 562, in compile
    p = sre_parse.parse(p, flags)
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\sre_parse.py", line 855, in parse
    p = _parse_sub(source, pattern, flags & SRE_FLAG_VERBOSE, 0)
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\sre_parse.py", line 416, in _parse_sub
    not nested and not items))
  File "C:\Users\lnv\AppData\Local\Programs\Python\Python36-32\lib\sre_parse.py", line 616, in _parse
    source.tell() - here + len(this))
sre_constants.error: nothing to repeat at position 0

J'ai essayé d'utiliser pd.read_html sur l'url aussi, mais cela a renvoyé une erreur de "Aucune table trouvée". L'url est : http://www.bursamalaysia.com/market/securities/equities/prices/#/?filter=BS08&board=MAIN-MKT§or=PROPERTIES&page=1.

2voto

ksai Points 699

Vous pouvez obtenir le tableau en utilisant le code suivant

import time
from selenium import webdriver
import pandas as pd

chrome_path = r"Chemin vers le pilote Chrome"
driver = webdriver.Chrome(chrome_path)
url = 'http://www.bursamalaysia.com/market/securities/equities/prices/#/?filter=BS02'

page = driver.get(url)
time.sleep(2)

df = pd.read_html(driver.page_source)[0]
print(df.head())

Voici la sortie

No  Code    Nom     Rem Dernière Effectuée   LACP    Chg % Chg   Vol ('00)   Acheter Vol ('00)   Acheter Vendre   Vendre Vol ('00)  Haut    Bas
0   1   5284CB  LCTITAN-CB  s   0.025   0.020   0.005   +25.00  406550  19878   0.020   0.025   106630  0.025   0.015
1   2   1201    SUMATEC [S] s   0.050   0.050   -   -   389354  43815   0.050   0.055   187301  0.055   0.050
2   3   5284    LCTITAN [S] s   4.470   4.700   -0.230  -4.89   367335  430 4.470   4.480   34  4.780   4.140
3   4   0176    KRONO [S]   -   0.875   0.805   0.070   +8.70   300473  3770    0.870   0.875   797 0.900   0.775
4   5   5284CE  LCTITAN-CE  s   0.130   0.135   -0.005  -3.70   292379  7214    0.125   0.130   50  0.155   0.100

Pour obtenir les données de toutes les pages, vous pouvez parcourir les pages restantes et utiliser df.append

1voto

Diamond Fang Points 94

Réponse: df = pd.read_html(target[0].get_attribute('outerHTML'))

Résultat:

description de l'image

Raison pour target[0]: driver.find_elements_by_id('bm_equities_prices_table') renvoie une liste de l'objet selenium webelement, dans votre cas, il n'y a qu'un seul élément, d'où [0]

Raison pour get_attribute('outerHTML'): nous voulons obtenir l'élément 'html'. Il existe 2 types de méthodes get_attribute pour cela : 'innerHTML' vs 'outerHTML'. Nous avons choisi 'outerHTML' parce que nous devons inclure l'élément actuel, où se trouvent les en-têtes de table, je suppose, au lieu de seulement le contenu interne de l'élément.

Raison pour df[0]: ``` pd.read_html() renvoie une liste de dataframes, le premier étant le résultat que nous voulons, d'où [0].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X