首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从网页中嵌入的Tableau图表中抓取工具提示值

如何从网页中嵌入的Tableau图表中抓取工具提示值
EN

Stack Overflow用户
提问于 2020-05-23 03:35:29
回答 1查看 1.6K关注 0票数 2

我正在尝试弄清楚是否有一种方法以及如何使用python从网页中的Tableau嵌入式图形中抓取工具提示值。

以下是用户将鼠标悬停在条形图上时工具提示的图形示例:

https://public.tableau.com/views/NumberofCOVID-19patientsadmittedordischarged/DASHPublicpage

_

patientsdischarges?:embed=y&:showVizHome=no&:host

_

url=https%3A%2F%2Fpublic.tableau.com%2F&:embed

_

代码

_

version=3&:tabs=no&:toolbar=yes&:animate

_

transition=yes&:display

_

静态

_

image=no&:display

_

spinner=no&:display

_

overlay=yes&:display

_

count=yes&publish=yes&:loadOrderID=1

我从我想要抓取的原始网页中抓取了这个url:

https://covid19.colorado.gov/hospital-data

如有任何帮助,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-24 02:01:48

编辑

我做了

用于抓取tableau仪表板的python库

..。实现更简单:

代码语言:javascript
复制
from tableauscraper import TableauScraper as TS

url = "https://public.tableau.com/views/Colorado_COVID19_Data/CO_Home"

ts = TS()
ts.loads(url)
dashboard = ts.getDashboard()

for t in dashboard.worksheets:
    #show worksheet name
    print(f"WORKSHEET NAME : {t.name}")
    #show dataframe for this worksheet
    print(t.data)

在repl.it上运行此程序

老答案

该图形似乎是在JS中从API的结果中生成的,如下所示:

代码语言:javascript
复制
POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID

会话

_

ID参数位于(其中)

用于构建iframe的URL中的textarea。

开始于

https://covid19.colorado.gov/hospital-data

使用类检查元素

获取

具有属性的元素

它会为您提供以下url:

前面的链接给出了一个带有id的文本区域

使用一堆json值

提取

和根路径(

)

在…上发表帖子

使用

作为表单数据

从结果中提取json (result不是json)

代码:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup
import json
import re

r = requests.get("https://covid19.colorado.gov/hospital-data")
soup = BeautifulSoup(r.text, "html.parser")

# get the second tableau link
tableauContainer = soup.findAll("div", { "class": "tableauPlaceholder"})[1]
urlPath = tableauContainer.find("param", { "name": "name"})["value"]

r = requests.get(
    f"https://public.tableau.com/views/{urlPath}",
    params= {
        ":showVizHome":"no",
    }
)
soup = BeautifulSoup(r.text, "html.parser")

tableauData = json.loads(soup.find("textarea",{"id": "tsConfigContainer"}).text)

dataUrl = f'https://public.tableau.com{tableauData["vizql_root"]}/bootstrapSession/sessions/{tableauData["sessionid"]}'

r = requests.post(dataUrl, data= {
    "sheet_id": tableauData["sheetId"],
})

dataReg = re.search('\d+;({.*})\d+;({.*})', r.text, re.MULTILINE)
info = json.loads(dataReg.group(1))
data = json.loads(dataReg.group(2))

print(data["secondaryInfo"]["presModelMap"]["dataDictionary"]["presModelHolder"]["genDataDictionaryPresModel"]["dataSegments"]["0"]["dataColumns"])

从那里你就有了所有的数据。您将需要查看数据的拆分方式,因为似乎所有数据都通过一个列表转储。查看JSON对象中的其他字段可能会对此有所帮助。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61962611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档