使用Python在Yahoo Finance的“分析”选项卡中进行抓取
我正在尝试从雅虎金融“分析”选项卡中提取股票BABA的“未来5年(每年)”值:。(从底部算起的第二排为2.85%) 我一直在尝试使用这些问题: 但我甚至无法从页面中提取数据 也尝试了此网站: 这是我写的获取网页数据的代码 首先导入包:使用Python在Yahoo Finance的“分析”选项卡中进行抓取,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我正在尝试从雅虎金融“分析”选项卡中提取股票BABA的“未来5年(每年)”值:。(从底部算起的第二排为2.85%) 我一直在尝试使用这些问题: 但我甚至无法从页面中提取数据 也尝试了此网站: 这是我写的获取网页数据的代码 首先导入包: from bs4 import BeautifulSoup as soup from urllib.request import urlopen as uReq 然后尝试从页面中提取数据: Url= "https://finance.yahoo.com/q
from bs4 import BeautifulSoup as soup
from urllib.request import urlopen as uReq
然后尝试从页面中提取数据:
Url= "https://finance.yahoo.com/quote/BABA/analysis?p=BABA"
r = requests.get(Url)
data = r.text
soup = BeautifulSoup(data,features="lxml")
当查看“数据”和“汤”对象的类型时
我明白了
type(data)
<class 'str'>
类型(数据)
我可以使用正则表达式提取“>未来5年”行所需的数据
但是当你看着
type(soup)
<class 'bs4.BeautifulSoup'>
类型(汤)
由于某种原因,其中的数据与页面不相关
看起来是这样的(仅复制了汤对象中的部分内容):
汤
window.performance&&window.performance.mark&&
window.performance.mark('PageStart');
阿里巴巴集团控股有限公司(BABA)分析师评级、估计和;
预测-雅虎财经
一种解决方案是使用正则表达式从JS中的JSON数据中提取值。JSON数据位于以下变量中:
root.App.main = { .... };
例如:
import requests
import re
import json
r = requests.get("https://finance.yahoo.com/quote/BABA/analysis?p=BABA")
data = json.loads(re.search('root\.App\.main\s*=\s*(.*);', r.text).group(1))
field = [t for t in data["context"]["dispatcher"]["stores"]["QuoteSummaryStore"]["earningsTrend"]["trend"] if t["period"] == "+5y" ][0]
print(field)
print("Next 5 Years (per annum) : " + field["growth"]["fmt"])
一种解决方案是使用正则表达式从JS中的JSON数据中提取值。JSON数据位于以下变量中:
root.App.main = { .... };
例如:
import requests
import re
import json
r = requests.get("https://finance.yahoo.com/quote/BABA/analysis?p=BABA")
data = json.loads(re.search('root\.App\.main\s*=\s*(.*);', r.text).group(1))
field = [t for t in data["context"]["dispatcher"]["stores"]["QuoteSummaryStore"]["earningsTrend"]["trend"] if t["period"] == "+5y" ][0]
print(field)
print("Next 5 Years (per annum) : " + field["growth"]["fmt"])
可以使用soup对象在页面上查找相应的元素。按照本教程中描述的步骤进行操作:。我尝试了链接,但我的汤对象与您添加的链接不一样(我对问题进行了一些编辑,以便您可以查看它的外观)。soup对象似乎没有来自页面的数据,但由于某种原因,数据对象确实包含来自页面的信息。您可以使用soup对象在页面上查找相应的元素。按照本教程中描述的步骤进行操作:。我尝试了链接,但我的汤对象与您添加的链接不一样(我对问题进行了一些编辑,以便您可以查看它的外观)。soup对象似乎没有来自页面的数据,但由于某些原因,数据对象确实包含来自页面的信息。看起来它工作正常,谢谢@伯特兰·马特尔。可能会询问您输入到r对象的URL:它与我发布的不一样,您是如何接收/找到它的?@TaL原始URL也有效,我刚刚删除了最后一个查询参数this URL“”?对于json部分,如果打开Chrome Developer控制台并检查html,则可以搜索变量root.App.main
。“'root\.App\.main\s*=\s*(.*);'”是一个正则表达式,它在root.App.main=之后和“;”之前提取所有内容。“如果可以,我可以再问您两个问题吗?您是如何知道使用json.loads方法而不是类似BeautifulSoup对象的东西的?”?您如何知道在其中输入“'root\.App\.main\s*=\s*(*);”?再次感谢re.search('root\.App\.main\s*=\s*(.*);',r.text)。组(1)
返回JSON文本。为了解析这个JSON,我使用了JSON.loads(jsontext)
看起来很有效,谢谢@伯特兰·马特尔。可能会询问您输入到r对象的URL:它与我发布的不一样,您是如何接收/找到它的?@TaL原始URL也有效,我刚刚删除了最后一个查询参数this URL“”?对于json部分,如果打开Chrome Developer控制台并检查html,则可以搜索变量root.App.main
。“'root\.App\.main\s*=\s*(.*);'”是一个正则表达式,它在root.App.main=之后和“;”之前提取所有内容。“如果可以,我可以再问您两个问题吗?您是如何知道使用json.loads方法而不是类似BeautifulSoup对象的东西的?”?您如何知道在其中输入“'root\.App\.main\s*=\s*(*);”?再次感谢re.search('root\.App\.main\s*=\s*(.*);',r.text)。组(1)
返回JSON文本。为了解析这个JSON,我使用了JSON.loads(jsontext)