Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python在Yahoo Finance的“分析”选项卡中进行抓取_Python_Web Scraping_Beautifulsoup - Fatal编程技术网

使用Python在Yahoo Finance的“分析”选项卡中进行抓取

使用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

我正在尝试从雅虎金融“分析”选项卡中提取股票BABA的“未来5年(每年)”值:。(从底部算起的第二排为2.85%)

我一直在尝试使用这些问题:

但我甚至无法从页面中提取数据

也尝试了此网站:

这是我写的获取网页数据的代码

首先导入包:

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)