从Morningstar / BeautifulSoup获取股票价格

时间:2019-02-03 18:39:50

标签: python beautifulsoup stock price morningstar

所以它正在发生。最后,我必须问关于Stackoverflow的第一个问题。

我正在尝试从Morningstar(https://www.morningstar.com/stocks/xnas/tsla/quote.html)获取股票的当前价格,为此我正在使用Beautifulsoup。

在HTML代码中,有一个唯一的ID(“ message-box-price”)。我想用它来获取价格,但是很遗憾,我找不到解决方案。如果有人可以帮助我,那就太好了。

我获取该网站的代码是:

import bs4
import requests

res = requests.get('https://www.morningstar.com/stocks/xnas/tsla/quote.html')
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'lxml')

我尝试了许多不同的方法,但我认为这些是最有前途的方法:

数字1:

price = soup.find(id='message-box-price')
price2 = price.find_next()
print(price2)

数字2:

price = soup.select("#message-box-price")
price2 = price.find_all_next()
print(price2)

数字3:

price = soup.find_all(id="message-box-price")
print(price)

我还尝试了它的一些变体,并使用.text例如来获取值。

错误已发生:

  • AttributeError:“ NoneType”对象没有属性“ find_previous”
  • AttributeError:“列表”对象没有属性“文本”
  • TypeError:select()得到了意外的关键字参数“ attrs”
  • 或者我刚得到一个空列表-> []

2 个答案:

答案 0 :(得分:1)

页面是动态的。您可以使用Selenium打开页面,进行渲染,然后获取信息:

import pandas as pd
import bs4 
from selenium import webdriver 

url = 'https://www.morningstar.com/stocks/xnas/tsla/quote.html'

browser = webdriver.Chrome()
browser.get(url)

html = browser.page_source

soup = bs4.BeautifulSoup(html,'html.parser')

price = soup.find('div', {'id':'message-box-price'})
price2 = price.text.strip()
print(price2)

browser.close()

输出:

print(price2)
$312.21

答案 1 :(得分:0)

就像他们的答案中提到的@ chitown88和@ rukh-ta一样,要得到这个价格,我必须使用硒。在这种情况下,最好使用pyautogui以CSV格式下载股票的整个价格历史记录。

我执行此操作的代码如下:

select permissions.permission_id,
       permission_description,
       case when user_id is null then 'FALSE' else 'TRUE' END as has_permission
FROM permissions
LEFT JOIN users_permissions 
  ON permission.permission_id = users_permissions.permissions_id and user_id = 1

如果某人有更简单和/或更快速的方式,请随时提及。

(另外,如果您想知道为什么我不使用任何其他股票api。问题是,我正在做一个项目,我在使用Morningstar宇宙的股票行情自动收录器。因此,晨星公司的价格也更有效率,因为行情自动收录器的价格经常变化,并且在自动化流程中,很多请求都失败了。)