1

所以它正在发生。最后,我要问我关于 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'
  • 或者我只是得到了一个空列表 -> [ ]
4

2 回答 2

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
于 2019-02-03T18:52:44.903 回答
0

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

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

from selenium import webdriver
import time
import pyautogui

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

browser = webdriver.Firefox()
browser.get(url)
time.sleep(7)

pyautogui.click(139, 833, button='left')
time.sleep(10)
pyautogui.click(973, 289, button='left')
time.sleep(2)
pyautogui.click(1649, 236, button='left')
time.sleep(1)

pyautogui.typewrite(['down'])
time.sleep(1)
pyautogui.typewrite(['enter'])

browser.close()

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

(另外,如果你想知道为什么我不使用任何其他股票 API。问题是,我正在做一个项目,我正在使用晨星宇宙的股票代码。因此,为了获得价格也来自晨星的效率更高,因为代码经常变化,并且在自动化过程中,许多请求都失败了。)

于 2019-02-03T21:26:29.030 回答