Cette question a déjà été posée, mais j'ai cherché et essayé et je n'arrive toujours pas à la faire fonctionner. Je suis un débutant en ce qui concerne Selenium.
Jetez un œil à: https: // finance .yahoo.com / quote / FB
J'essaie de récupérer la "Note recommandée", qui dans ce cas au moment de la rédaction est 2. J'ai essayé:
source = driver.page_source print(source)
... qui ne me donne pas d'erreur, mais n'imprime aucun texte non plus. J'ai aussi essayé avec xpath, class_name, etc. Au lieu de cela, j'ai essayé:
driver.get('https://finance.yahoo.com/quote/FB')
time.sleep(10)
rating = driver.find_element_by_css_selector('#Col2-4-QuoteModule-Proxy > div > section > div > div > div')
print(rating.text)
Cela ne fonctionne pas non plus, j'obtiens juste la source réelle sans le générateur contenu. Lorsque je clique sur "Afficher la source" dans Chrome, ce n'est pas là. J'ai essayé d'enregistrer la page Web dans Chrome. Cela n'a pas fonctionné.
Ensuite, j'ai découvert que si j'enregistrais la page Web entière, y compris les images et les fichiers css et tout, le code source est différent de celui où je viens d'enregistrer le HTML. P >
Le fichier HTML que j'obtiens lorsque j'enregistre toute la page Web en utilisant Chrome contient les informations dont j'ai besoin, et au début, je pensais utiliser pyautogui pour juste Ctrl + S chaque page Web, mais il doit y avoir un autre moyen.
Les informations qui J'ai besoin est évidemment là, dans le code html, mais comment puis-je l'obtenir sans télécharger la page Web entière?
4 Réponses :
Tout d'abord, vous devez attendre que l'élément soit cliquable, puis assurez-vous de faire défiler jusqu'à l'élément avant d'obtenir la note. Essayez
val = rating.get_attribute("aria-label")
MODIFIER:
Utilisez le sélecteur XPath suivant:
rating = driver.find_element_by_css_selector('//a[@data-test="recommendation-rating-header"]//following-sibling::div//div[@class="rating-text Arrow South Fw(b) Bgc($buy) Bdtc($buy)"]')
Et que vous aurez: p>
'//a[@data-test="recommendation-rating-header"]//following-sibling::div//div[@class="rating-text Arrow South Fw(b) Bgc($buy) Bdtc($buy)"]'
Pour extraire la valeur du curseur, utilisez
element.location_once_scrolled_into_view element.text
Ce sélecteur CSS fonctionne très bien et il me donne 56, qui est le "score ESG total", mais ce n'est pas cet élément que j'essaie de trouver. J'essaie de trouver la note recommandée, une échelle de 1 à 5. J'ai essayé avec xpath, css_selector, class_name, mais je ne peux pas le faire fonctionner.
Essayez ceci pour exécuter le contenu généré dynamiquement (JavaScript):
driver.execute_script ("return document.body.innerHTML")
Voir question similaire: Exécution de javascript dans Selenium à l'aide de Python
Malheureusement, cela ne change rien. J'obtiens toujours le même code HTML qu'avant.
Le sélecteur CSS, div.rating-text , fonctionne très bien et est unique sur la page. Renvoyer .text vous donnera la valeur que vous recherchez.
Le script ci-dessous répond à une question différente, mais je pense que c'est ce que vous recherchez.
import requests
from bs4 import BeautifulSoup
base_url = 'http://finviz.com/screener.ashx?v=152&s=ta_topgainers&o=price&c=0,1,2,3,4,5,6,7,25,63,64,65,66,67'
html = requests.get(base_url)
soup = BeautifulSoup(html.content, "html.parser")
main_div = soup.find('div', attrs = {'id':'screener-content'})
light_rows = main_div.find_all('tr', class_="table-light-row-cp")
dark_rows = main_div.find_all('tr', class_="table-dark-row-cp")
data = []
for rows_set in (light_rows, dark_rows):
for row in rows_set:
row_data = []
for cell in row.find_all('td'):
val = cell.a.get_text()
row_data.append(val)
data.append(row_data)
# sort rows to maintain original order
data.sort(key=lambda x: int(x[0]))
import pandas
pandas.DataFrame(data).to_csv("AAA.csv", header=False)