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

Python 如何从网页中嵌入的图表中提取工具提示值,python,web-scraping,graph,web-crawler,tableau-api,Python,Web Scraping,Graph,Web Crawler,Tableau Api,我试图找出是否有一种方法,以及如何使用python从网页中的Tableau嵌入式图形中提取工具提示值 以下是当用户将鼠标悬停在条形图上时带有工具提示的图形示例: 我从原始网页抓取了这个url,我想从中抓取: 非常感谢您的帮助。编辑 我已经做好了准备。实现更简单: from tableauscraper import TableauScraper as TS url = "https://public.tableau.com/views/Colorado_COVID19_Data/

我试图找出是否有一种方法,以及如何使用python从网页中的Tableau嵌入式图形中提取工具提示值

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

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

非常感谢您的帮助。

编辑 我已经做好了准备。实现更简单:

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)


旧答案 该图形似乎是根据API的结果在JS中生成的,如下所示:

POST https://public.tableau.com/TITLE/bootstrapSession/sessions/SESSION_ID 
SESSION_ID参数位于用于构建iframe的URL中的
tsConfigContainer
text区域中

从:

  • 用class
    tableau占位符检查元素
  • 获取属性为
    name
  • 它将为您提供url:
    https://public.tableau.com/views/{urlPath}
  • 上一个链接提供了一个id为
    tsConfigContainer
    的文本区域,其中包含一组json值
  • 提取会话id和根路径(
    vizql\u root
  • https://public.tableau.com/ROOT_PATH/bootstrapSession/sessions/SESSION_ID
    图纸ID
    作为表单数据
  • 从结果中提取json(结果不是json)
代码:

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对象中的其他字段可能会对此有所帮助。

我建议在尝试从已发布的可视化中获取数据之前查看资源。您可以找到原始来源,并获得一个更可靠的方式来获得您想要的数据。伟大的回应!谢谢你抽出时间。你能回答以下问题吗?为了我的清晰和理解,我需要解决其他网站的问题:1-我在Chrome中检查时没有看到“param”元素。为什么不呢?2-您是如何计算“showVizHome=no”的Get参数的?我在任何地方都看不到它。@dmornad在带有@dmornad的class
tableauPlaceholder
的div中有一些
param
元素。当您检查图形时,可以注意到它嵌入在iframe中。事实上,tableau js lib正在动态创建iframe url。我刚刚复制了这个url。当您检查时,您可以看到有很多url参数,但我发现只有showVizHome才能获取数据。完整url为: