我正在使用Beautiful Soup刮以下页面:https://www.nyse.com/quote/XNYS:AAN
我要在股票名称下加上缩写名称。但是,当我运行脚本时,似乎for e in Entry.objects.filter(pub_date__year=2010):
e.comments_on = False
e.save()
不起作用,因为没有下载整个html文件。
soup.find()
我希望看到包含main_url = "https://www.nyse.com/quote/XNYS:AAN"
import requests
result = requests.get(main_url)
from bs4 import BeautifulSoup
soup = BeautifulSoup(result.text, 'html.parser')
print(soup.find("div", class_ = "d-dquote-symbol").prettify())
且股票价值正确的<div>
。但是,打印返回“无”,因为脚本无法找到该标签。我知道它的存在是因为我首先使用inspect元素来找到标签。
答案 0 :(得分:3)
发生这种情况是因为您要抓取的页面不是静态的。
在显示值之前,或者通过检查浏览器的调试工具中的network
标签,您可以看到它具有“旋转器”。
requests.get
不会进行任何“后续”请求,因此您只会得到空白页。
要获取股票价值(通过HTML抓取...),您应该使用网站本身用于获取股票价值的请求。
注意:最好使用正式的API来获取这种结构化数据。
答案 1 :(得分:0)
您可以使用任何浏览器模拟器获取报价。 pyppeteer是实现技巧的不错选择。该脚本将等待引号可用,然后对其进行解析。
import asyncio
from pyppeteer import launch
url = "https://www.nyse.com/quote/XNYS:AAN/QUOTE"
async def get_quote(link):
wb = await launch()
page = await wb.newPage()
await page.goto(link)
await page.waitForSelector(".d-dquote-bigContainer [class^='d-dquote-x']")
container = await page.querySelector(".d-dquote-bigContainer [class^='d-dquote-x']")
quote = await page.evaluate('(element) => element.innerText', container)
print(quote)
asyncio.get_event_loop().run_until_complete(get_quote(url))
此刻的输出:
60.09