微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何从 Tableau 仪表板中提取值

如何解决如何从 Tableau 仪表板中提取值

我正在尝试从此网页中提取“公司和测试”值:https://public.tableau.com/views/v_7_14_2020/COVID-19TestingCommons

首选输出是包含公司和每个公司的测试数量的数组。

还有一个帖子 (How can I scrape tooltips value from a Tableau graph embedded in a webpage) 有类似的问题..

我尝试使用它,但在我的情况下不起作用

谢谢。

import requests 
from bs4 import BeautifulSoup
import json
import time

data_host = "https://public.tableau.com"

r = requests.get(
    f"{data_host}/views/v_7_14_2020/COVID-19TestingCommons",params= {
        ":showVizHome":"no",}
)
soup = BeautifulSoup(r.text,"html.parser")

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

dataUrl = f'{data_host}{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"])

解决方法

在本例中,您的画面网址使用的是 server side rendering。这意味着,默认情况下没有数据发送到浏览器,服务器正在使用数据(表格、地图等)渲染图像,使用 JS 将鼠标坐标发送到服务器来触发选择事件。

但在您的情况下,有一种方法可以使用过滤器在客户端呈现一些数据。当您选择过滤器时,例如“标本”过滤器,数据会在客户端呈现(实际数据会发送到浏览器)。

我制作了一个 tableau scraper library 来从 Tableau 工作表中提取数据。您可以执行以下代码,该代码将加载表格数据(空工作表),在名为 Diagnostic Target 的工作表 Specimen Collected 中获取过滤器并迭代此过滤器的每个值并获取每个值的工作表数据这些:

from tableauscraper import TableauScraper as TS
import pandas as pd

url = "https://public.tableau.com/views/v_7_14_2020/COVID-19TestingCommons"

ts = TS()
ts.loads(url)
workbook = ts.getWorkbook()

ws = workbook.getWorksheet("Diagnostic Target")

specimens = [
    t["values"]
    for t in ws.getFilters()
    if t["column"] == "Specimen Collected"
][0]

pdList = []
for specimen in specimens:
    print(f"specimen: {specimen}")
    specResultWb = ws.setFilter("Specimen Collected",specimen)
    df = specResultWb.getWorksheet("Company and Tests").data
    pdList.append(df)

result = pd.concat(pdList,ignore_index=True)
print(result)

repl.it:https://replit.com/@bertrandmartel/TableauCovid19TestingCommonsASU

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。