beauthulsoup解析不立即加载的表数据

2024-06-06 07:50:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用beautifulsoup从https://www.zacks.com/stock/research/MMM/earnings-announcements下载收益公告数据。当我看表时,我感兴趣的表(收益公告表)只显示“正在加载数据…”。但是,如果我把汤的全部内容打印出来,我确实能看到我要找的信息。我可以将这些数据隔离为一个“脚本”元素,但其中包含了许多其他不需要的信息。我如何选择并解析我要查找的特定数据,即“收益公告表”表的内容,如下所示:

“变量对象={ “收益公告表”: [[“10/25/2016”,“9/2016”,“$2.14”,“--”,”--“,“开张前”],…”

以下是我目前所掌握的情况:

from urllib import request
from urllib import error
from bs4 import BeautifulSoup

def download_parse_earnings(symbol):

request_string = "https://www.zacks.com/stock/research/%s/earnings-announcements" % symbol
print(request_string)

try:
    web = request.urlopen(request_string)
except error.HTTPError:
    return

soup = BeautifulSoup(web.read(), 'lxml')
data = soup.find_all("script")[28].string
print(data)

Tags: 数据fromhttpsimportcomstringrequestwww
2条回答

一种方法是启动Selenium并使用它的Javascript引擎。这并不简单,我在这里提供了一个替代方案,它是一个完全的黑客攻击,但它应该适用于您感兴趣的页面。在

假设页面是自动生成的,我们观察到您需要的数据在其中(从您的程序继续):

import json
earnings = json.loads(data.split('var obj =')[1].splitlines()[2])

这是利用Javascript对象是JSON的事实,因此我们直接从源代码读取。结果就是这样一个列表:

^{pr2}$

第一个元素对应于表的第一行,即标题。你现在只需要清理数据。在

不使用Selenium,但仍然使用json作为第一个答案,您可以使用BS挖掘出所需的内容。在

>>> from bs4 import BeautifulSoup
>>> from urllib import request
>>> URL='https://www.zacks.com/stock/research/MMM/earnings-announcements'
>>> HTML=request.urlopen(URL).read()
>>> soup=BeautifulSoup(HTML)
>>> import json
>>> scripts=soup.findAll('script')
>>> len(scripts)
36

>>> for script in scripts:
...     if script.has_attr('type') and script.attrs['type']=='text/javascript' and script.text.strip().startswith('$(document).ready(function()'):
...         break

这样,javascript就可以作为脚本.text. 您仍然需要做一些稍微聪明的事情来提取Rubik's答案中显示的行。但没有什么是不可能的。在

相关问题 更多 >