2017-11-15 2 views
1

Ich versuche, den Wert von einer Yahoo Finance-Seite zu analysieren. Ich habe Chrome das Element von Interesse (der aktuelle Kurs einer Aktie) und verwendet, um die XPath in diesem einfachen Skript zu inspizieren:Parsing Xml - aus durch einen Knoten

from lxml import html 
import requests 

page = requests.get('https://finance.yahoo.com/quote/VNQ?p=VNQ') 
tree = html.fromstring(page.content) 

print tree.xpath('//*[@id="quote-header-info"]/div[3]/div[1]/div/span[1]/text()') 

Doch was ich erhalte, ist der Text Wert von dem nächsten span-Tag. Ich habe versucht, den Xpath, den Chrome mir gibt, zu ändern, um den vorherigen Textwert ohne Erfolg zu erhalten. Kann mir jemand sagen, wo ich falsch gelaufen bin?

+0

Sind Sie _sure_ all diese hardcoded Indizes sind korrekt? –

+0

Geben Sie das erwartete Ergebnis ein – RomanPerekhrest

+0

Sie werden aus dem Chrome Copy Path ausgeschnitten und mit dem gewünschten Text markiert. Die zwei Dinge, die ich nicht verstehe, sind, warum es den Text, der wie der xpath zu sein scheint, zum Text des nächsten span-Tags gibt, anstatt zu dem hervorgehobenen. Und zweitens, angenommen, dass Chrome einen falschen xpath gibt, wie ändere ich es, um den richtigen zu erhalten (da es sehr nah ist). – ihf

Antwort

0

Wenn dies der Preis ist, den Sie möchten, können Sie es von einem einfacheren Ort auf der Seite nehmen. Zum Beispiel enthält der Titel HTML-Tag es. Mit ein wenig String-Parsing erhalten Sie den richtigen Wert. Der Wert ist immer nach dem ersten Leerzeichen.

from lxml import html 
import requests 

page = requests.get('https://finance.yahoo.com/quote/VNQ?p=VNQ') 
tree = html.fromstring(page.content) 

title = tree.xpath('//title/text()')[0] 
value = title.split()[1] 

print(value) 
+0

Danke. Ich habe gerade Ihr Skript ausprobiert und bekam: > python stack.py Traceback (letzten Aufruf zuletzt): Datei > "stack.py", Zeile 8, in > Wert = int (title.split() [1 ]) ValueError: ungültiges Literal für int() mit Basis 10: ':' Ich werde mit diesem etwas mehr spielen. – ihf

+0

Versuchen Sie ohne Int(). Habe gerade den Code in meiner Antwort aktualisiert. Bitte akzeptiere meine Antwort, wenn das funktioniert. –

+0

>>> aus lxml importieren html >>> importieren Anfragen >>> page = requests.get ('https://finance.yahoo.com/quote/VNQ?p=VNQ') >>> Baum = html.fromstring (page.content) >>> title = baum.xpath ('// titel/text()') [0] >>> wert = title.split() [1] >>> drucken (Wert) : – ihf