Html 导入数据网站,当Xpath或regexpr不工作时:将使用JSON

Html 导入数据网站,当Xpath或regexpr不工作时:将使用JSON,html,regex,xpath,web-scraping,Html,Regex,Xpath,Web Scraping,我想从以下网站检索数据: 我没有很多关于网页垃圾和html的知识,所以我会尝试一步一步地解释我的问题 该网页的数据位于季度和年度(底页)。但问题是,来自这两个数据库的数据具有相同的名称:divclass=“value\uu 01a1ae38”。对于季度数据和年度数据,收入净收入,利润率也是如此 季度和年度之间唯一的变化是: 选择“季度”时: <div class = "bb-tab quarterly item__4b54920e selected"> <d

我想从以下网站检索数据:

我没有很多关于网页垃圾和html的知识,所以我会尝试一步一步地解释我的问题

该网页的数据位于
季度
年度
(底页)。但问题是,来自这两个数据库的数据具有相同的名称:
divclass=“value\uu 01a1ae38”
。对于
季度数据和
年度数据,
收入
净收入
利润率
也是如此

季度和年度之间唯一的变化是:

选择“季度”时:

<div class = "bb-tab quarterly item__4b54920e selected">
<div class ="bb-tab annual item__4b54920e">
<div class = "bb-tab quarterly item__4b54920e">
<div class ="bb-tab annual item__4b54920e selected">
返回:


6,006.00    -87 -1.45%  17,254.00   15,576.00   43.18%  -706    -20 7216,006.00 -87 -1.45%  17,254.00   15,576.00   43.18%  -706    -20 721
然而,这种方法不可能从年度数据中检索数据

编辑22-07

使用此链接:

使用此代码,您编写了
=Transpose(Split(REGEXREPLACE(TEXTJOIN(“,TRUE,IMPORTDATA(P11)),“+?2019-09-30”值:(.+?)}],“$1,”,”),”)

输出此代码:

27082
421
1.5545
当我想获得2018年的数据时,我将代码改为
=转置(拆分(REGEXREPLACE(TEXTJOIN(“,TRUE,IMPORTDATA(P11)),“+?2018-09-30”值:(.+?)}.,“$1,”,“,”),”)

这将提供以下输出:

26792}{"dateTime":"2019-09-30"value:27082
333}{"dateTime":"2019-09-30"value:421           
1.2429000000000001}{"dateTime":"2019-09-30"value:1.5545

它以正确的值
26792
开始,然后将所有值添加到答案中。我一直在玩函数的
replace
部分,但没有成功地只显示2018年的数据。您能帮我了解一下
regexpreplace
函数的工作原理吗?为什么会添加2019年的值而不是2018年的值?

您可以使用
IMPORTDATA
从后台加载的JSON获取数据。然后使用公式(
ARRAYFORMULA
JOIN
REGEXREPLACE
SPLIT
)来操作导入的数据并检索感兴趣的值。您将需要以下URL:

https://www.bloomberg.com/markets2/api/report/income/EQT/B4B%3AGR/annual?locale=en&currency=EUR
https://www.bloomberg.com/markets2/api/report/balance/EQT/B4B%3AGR/annual?locale=en&currency=EUR
https://www.bloomberg.com/markets2/api/report/cash/EQT/B4B%3AGR/annual?locale=en&currency=EUR
以及B9单元格中的以下公式:

=SPLIT(REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B3));".+?2019-09-30""value:(.+?)}].";"$1;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B4));".+?2019-09-30""value:(.+?)}].";"$1;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B5));".+?2019-09-30""value:(.+?)}].";"$1;");";")
输出:

如果需要使用这些值,请使用B10中的以下公式清除结果:

=ARRAYFORMULA(VALUE(ARRAYFORMULA(SUBSTITUTE(SPLIT(REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B3));".+?2019-09-30""value:(.+?)}].";"$1;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B4));".+?2019-09-30""value:(.+?)}].";"$1;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B5));".+?2019-09-30""value:(.+?)}].";"$1;");";");".";","))))
旁注:我的总部在欧洲。因此,您可能需要将公式中的“;”替换为“,”

编辑:要使年度零件自动,请选择几个选项中的两个(使用
查询
现在
,或使用
今天
的工作表):

输出:

编辑2

要选择特定年份,请在
REGEXREPLACE
公式中使用以下正则表达式:

^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$
与<代码>$1$2;$3;组作为替代。只需更改正则表达式中年份的值(例如:
2018
2017
)即可获取另一个年份

B9中使用的公式:

=ARRAYFORMULA(SUBSTITUTE(SPLIT(REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B2));"^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$";"$1;$2;$3;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B3));"^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$";"$1;$2;$3;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B4));"^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$";"$1;$2;$3");";");".";",")*1)
输出:


谢谢@E.Wiest的帮助!它可以工作:)我以前听说过Json,但从未让它工作过。我打算玩弄它,以便更好地理解它。我终于在“XHR”下找到了链接,你也是在这里找到的吗?此外,您能否帮助我集思广益,思考如何始终导入最新数据?现在它将以“2019-09-30”进口。但一年后,这将过时。可以插入最新的日期吗?您好!关于你的解决方案,我还有一个问题。我试图分别从某一年中选择数据。但我不能让它工作。我已经编辑了我的问题。你能帮我理解一下RegExpReplace吗?我怎样才能让它工作呢?这篇文章已经用一个解决方案(一个更干净的正则表达式来选择一个特定的年份)进行了编辑。
=SPLIT(TEXTJOIN(";";TRUE;ARRAYFORMULA(REGEXREPLACE(QUERY(TRANSPOSE(SPLIT(TEXTJOIN("";TRUE;IMPORTDATA(B3));"}"));"select * WHERE Col1 contains (YEAR(NOW())-1)");".+value:(.+)";"$1")))&";"&TEXTJOIN(";";TRUE;ARRAYFORMULA(REGEXREPLACE(QUERY(TRANSPOSE(SPLIT(TEXTJOIN("";TRUE;IMPORTDATA(B4));"}"));"select * WHERE Col1 contains (YEAR(NOW())-1)");".+value:(.+)";"$1")))&";"&TEXTJOIN(";";TRUE;ARRAYFORMULA(REGEXREPLACE(QUERY(TRANSPOSE(SPLIT(TEXTJOIN("";TRUE;IMPORTDATA(B5));"}"));"select * WHERE Col1 contains (YEAR(NOW())-1)");".+value:(.+)";"$1")));";")
^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$
=ARRAYFORMULA(SUBSTITUTE(SPLIT(REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B2));"^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$";"$1;$2;$3;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B3));"^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$";"$1;$2;$3;")&REGEXREPLACE(TEXTJOIN("";TRUE;IMPORTDATA(B4));"^.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+?2018-.+?:(.+?)}.+$";"$1;$2;$3");";");".";",")*1)