Xpath Yahoo Finance

时间:2018-08-27 06:56:55

标签: python-3.x xpath python-requests lxml yahoo-finance

我正试图从Yahoo获取数据,主要是股票的EV / EBITDA。

我尝试使用chrome中的xpath来获取文本,该文本返回[];即使删除了“ tbody”

from lxml import html
import requests

page = requests.get('https://finance.yahoo.com/quote/AAPL/key-statistics? 
p=')
tree = html.fromstring(page.content)
data = tree.xpath('//*[@id="Col1-0-KeyStatistics- 
Proxy"]/section/div[2]/div[1]/div[1]/div/table/tbody/tr[9]/td[2]/text()')

print(data)

同样,我删除了tbody,仍然得到[]。

我已经可以使用以下内容找回一些文字。

from lxml import html
import requests

同时1:

tick = input('Type in stock ticker:  ')

page = requests.get('https://finance.yahoo.com/quote/' + tick + '/key-statistics?p=')
tree = html.fromstring(page.content)
data = tree.xpath('//*[@class="Fz(s) Fw(500) Ta(end)"]/text()')

print('\n') 
print( tick + '-EV/EBITDA' + ':' +data[8])
print('\n')
pass

这适用于大多数股票,但是由于某些股票缺少数据,因此返回的第9个值并不总是EV / EBITDA。网络上有文本“ N / A”,但脚本没有占位符,因此空白字段会导致数据移动。

结果:

Type in stock ticker:  AAPL


AAPL-EV/EBITDA:13.81


Type in stock ticker:  DRIO


DRIO-EV/EBITDA:-221.56%


Type in stock ticker: 

DRIO在EV / EBITDA之前缺少一些数据,因此返回了错误的值。

我需要使以上代码具有N / A值的占位符。 要么 通过preferebly xpath正确获得EV / EBITDA。

我刚开始编写<1个月的经验,自学成才,很容易。

1 个答案:

答案 0 :(得分:0)

弄清楚了。在text()之前添加了//而不是/ 此返回N / A,其中不存在N / A值,而不是没有值,因此返回的列表中的第8个项目始终为EV / EBITDA,这也使我可以轻松提取其他数据作为股票。

from lxml import html
import requests

while 1:
tick = input('Type in stock ticker:  ')

page = requests.get('https://finance.yahoo.com/quote/' + tick + '/key-statistics?p=')
tree = html.fromstring(page.content)
data = tree.xpath('//*[@class="Fz(s) Fw(500) Ta(end)"]//text()')

print('\n') 
print( tick)
print('Market Cap' + ': ' + data[0])
print('Enterprise Value' + ': ' + data[1])
print('P/E' + ': ' + data[2])
print('PEG' + ': ' + data[4])
print('P/S' + ': ' + data[5])
print('P/B' + ': ' + data[6])
print('EV/EBITDA' + ': ' + data[8])
print('\n')
pass

将为代码'AAPL”返回以下内容

Type in stock ticker:  AAPl


AAPl
Market Cap: 1.05T
Enterprise Value: 1.09T
P/E: 19.74
PEG: 1.42
P/S: 4.12
P/B: 9.18
EV/EBITDA: 13.85


Type in stock ticker: