2017-09-16 5 views
0

J'essaie de récupérer une donnée à partir de la page de ratio de clé Morningstar pour un stock donné en utilisant XPath. J'ai le chemin complet qui renvoie un résultat dans le plug-in XPath Helper tooldbar pour google chrome mais quand je le branche dans mon code, je reçois une liste vide retournée.Liste vide renvoyée lors de l'utilisation de XPath avec les ratios de clé Morningstar

Comment obtenir le résultat que je souhaite obtenir? Est-ce seulement possible? Est-ce que j'utilise la mauvaise approche?

Toute aide est très appréciée!

morceau de données que je souhaite en retour:

AMD ratios clés Exemple:

AMD Key Ratios Example

Mon code:

from urllib.request import urlopen 
import os.path 
import sys 
from lxml import html 
import requests 

page = requests.get('http://financials.morningstar.com/ratios/r.html?t=AMD&region=USA&culture=en_US') 
tree = html.fromstring(page.content) 
rev = tree.xpath('/html/body/div[1]/div[3]/div[2]/div[1]/div[1]/div[1]/table/tbody/tr[2]/td[1]') 
print(rev) 

Résultat du code:

[]

résultat souhaité XPath Helper:

XPath Result

Merci, Non Euler

Répondre

0

C'est l'une de ces pages qui téléchargent une grande partie de son contenu en plusieurs étapes. Si vous recherchez l'article que vous voulez après avoir utilisé seulement requests, vous verrez qu'il n'est pas encore disponible, comme indiqué ici. Une stratégie pour traiter ces pages implique l'utilisation de la bibliothèque de sélénium. Ici, le sélénium lance une copie du navigateur Chrome, charge cette URL puis utilise une expression xpath pour localiser l'élément d'intérêt td. Enfin, le numéro que vous souhaitez devient disponible en tant que propriété text de cet élément.

>>> from selenium import webdriver 
>>> driver = webdriver.Chrome() 
>>> driver.get(url) 
>>> td = driver.find_element_by_xpath('.//th[@id="i0"]/td[1]') 
<selenium.webdriver.remote.webelement.WebElement (session="f436b07c27742abb36b262639245801f", element="0.12745670001529863-2")> 
>>> td.text 
'5,858' 
+0

Merci de prendre le temps d'expliquer la question de façon claire et simple Bill Bell. Je l'apprécie énormément. Savez-vous combien de fois je peux appeler l'étoile du matin en utilisant requests.get? –

+0

Vous êtes les bienvenus. Je regrette de ne pas pouvoir vous dire combien de fois vous pouvez frapper leur serveur. En fait, c'était la première fois que je voyais une de leurs pages. Bonne chance! –

+0

Pas de problème, merci encore Bill pour toute l'aide! –

0

Comme le contenu de cette page est générée dynamiquement de sorte que vous pouvez passer par le processus comme Bill Bell montre déjà, ou vous pouvez saisir la source de la page puis appliquez sélecteur CSS sur elle pour obtenir la valeur souhaitée. Voici une alternative à XPath:

from lxml import html 
from selenium import webdriver 

driver = webdriver.Chrome() 
driver.get('http://financials.morningstar.com/ratios/r.html?t=AMD&region=USA&culture=en_US') 
tree = html.fromstring(driver.page_source) 
driver.quit() 
rev = tree.cssselect('td[headers^=Y0]')[0].text 
print(rev) 

Résultat:

5,858 
+0

Merci d'avoir pris le temps de répondre à Shahin! Votre réponse a été couronnée de succès et je vous remercie d'avoir pris le temps de m'aider! Savez-vous combien de fois vous pouvez appeler driver.get sur un site web ou tree.cssselect sur une certaine page? Y at-il une limite à combien vous pouvez tirer d'une page une fois que vous utilisez driver.get? –