如何适配Tableau Scraper抓取带自定义表格的公开Tableau仪表盘?
问题:Tableau Scraper抓取自定义仪表盘返回空DataFrame并报错
目标是用Tableau Scraper抓取支持自定义表格的公开Tableau仪表盘,将下拉选项转为可组合参数生成自定义CSV并自动下载。运行指定代码后返回空DataFrame并报错,需解决该问题。
目标仪表盘链接:https://tabexternal.dshs.texas.gov/t/THD/views/Deaths/Deaths?%3Aembed=y&showTabs=true&%3Adisplay_count=n&%3AshowVizHome=n&%3Aorigin=viz_share_link
用户输入代码
from tableauscraper import TableauScraper as TS url = 'https://tabexternal.dshs.texas.gov/t/THD/views/Deaths/Deaths?%3Aembed=y&showTabs=true&%3Adisplay_count=n&%3AshowVizHome=n&%3Aorigin=viz_share_link' ts = TS() ts.loads(url) wb = ts.getWorkbook() data = wb.getCsvData(sheetName='Number of Deaths') print(data)
返回错误结果
Empty DataFrame Columns: [{"timeStamp":"2022-10-08 15:58:16.057", errorResponseType:"Generic", errorExtras:"(Y0GeF0ZgfP4LOiCpE7cUNwAAAIY, 3:0)"}] Index: []
解决方法
1. 确认工作表与视图的真实名称
仪表盘显示的“Number of Deaths”可能是前端标签,而非内部真实名称。先列出所有可用的工作表和视图:
wb = ts.getWorkbook() for sheet in wb.sheets: print(f"工作表名称: {sheet.name}") for viz in sheet.vizzes: print(f" 视图名称: {viz.name}")
运行后就能看到系统识别的真实名称,替换后续代码中的对应字段。
2. 配置筛选参数(下拉选项)
仪表盘的下拉选项对应筛选器,必须先设置筛选值才能获取对应数据:
# 获取目标工作表 sheet = wb.getSheetByName("真实工作表名称") # 查看所有筛选器及可选值 filters = sheet.getFilters() for f in filters: print(f"筛选器名称: {f.name}") print(f"可选值: {f.values}") # 设置单个筛选值,例如设置年份为2023 sheet = sheet.setFilter("Year", "2023") # 多选筛选器传入列表即可 # sheet = sheet.setFilter("Race/Ethnicity", ["White", "Black"])
3. 获取并导出CSV数据
设置好筛选器后,从对应视图提取数据并保存:
viz = sheet.getVizByName("真实视图名称") data = viz.getCsvData() # 导出为CSV文件 data.to_csv("自定义德州死亡数据.csv", index=False)
完整示例代码
from tableauscraper import TableauScraper as TS url = 'https://tabexternal.dshs.texas.gov/t/THD/views/Deaths/Deaths?%3Aembed=y&showTabs=true&%3Adisplay_count=n&%3AshowVizHome=n&%3Aorigin=viz_share_link' ts = TS() ts.loads(url) # 切换到目标标签页(如需要) ts.switchTab("Deaths") wb = ts.getWorkbook() # 打印所有工作表和视图,确认真实名称 for sheet in wb.sheets: print(f"工作表名称: {sheet.name}") for viz in sheet.vizzes: print(f" 视图名称: {viz.name}") # 假设真实工作表为"Deaths",视图为"Number of Deaths" sheet = wb.getSheetByName("Deaths") # 设置年份筛选器为2022 filters = sheet.getFilters() for f in filters: if f.name == "Year": sheet = sheet.setFilter(f.name, "2022") break # 获取数据并保存 viz = sheet.getVizByName("Number of Deaths") data = viz.getCsvData() print(data) data.to_csv("德州死亡数据.csv", index=False)
内容的提问来源于stack exchange,提问作者Terry Blanc
相关产品推荐
相关产品推荐

