为什么我的html解析器不下载整个html文档?

时间:2019-06-13 14:05:46

标签: python python-3.x web-scraping beautifulsoup

我正在使用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元素来找到标签。

2 个答案:

答案 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