Power Query 是可重复的导入和转换层;可见的工作表是呈现层。一个好的工作流程会保留源、字段类型和更新上下文,而不是用最新请求返回的内容取代报告。Nstdata Crawl 在获取需要管理呈现或网站收集的情况变得相关,之前 Excel 收到数据。
Power Query 概述 解释了连接、转换和加载之间的分离。从决定哪个阶段失败开始。未公开合适表格的页面需要不同的获取策略,而不仅仅是不同的工作表公式。
开始之前你需要什么?
您需要一个受支持的 Excel 安装、一个允许的来源、一个已知的表或模式,以及一个接受刷新结果的规则。下面的本机说明针对使用已文档化的网页连接器的 Excel for Windows。Excel for Mac 和 Excel for the web 具有不同的连接器和刷新可用性;在遵循 Windows 功能区路径之前,请检查您产品的当前功能。
将以下内容保存为 table_to_csv.py。它获取一个公共演示页面,检查预期的架构,并写入选定的表格。它不递归或从任意 div 布局推测表格。
import csv
from pathlib import Path
import requests
from bs4 import BeautifulSoup
url ="https://testpages.eviltester.com/pages/basics/html-tag-table/"parts =[]size =0with requests.get(url, timeout=(10,30), stream=True)as response: response.raise_for_status()for part in response.iter_content(65536): size +=len(part)if size >1_048_576:raise RuntimeError("Unexpectedly large demonstration page") parts.append(part)table = BeautifulSoup(b"".join(parts),"html.parser").select_one("table#mytable")if table isNone:raise RuntimeError("Expected demonstration table was not found")rows =[[cell.get_text(" ", strip=True)for cell in row.find_all(["th","td"])]for row in table.find_all("tr")]ifnot rows or rows[0]!=["Name","Amount"]:raise RuntimeError("Unexpected table headers")iflen(rows)<2orany(len(row)!=2for row in rows):raise RuntimeError("Empty or inconsistent table")ifany(cell.lstrip().startswith(("=","+","-","@"))for row in rows for cell in row):raise RuntimeError("Formula-like value requires review before CSV export")with Path("table-data.csv").open("w", newline="", encoding="utf-8-sig")asfile: csv.writer(file).writerows(rows)print(f"Saved {len(rows)-1} rows to table-data.csv; source: {url}")
import os
from pathlib import Path
from nstdata_ai_crawl import NstDataClient, ScrapeRequestDto
token = os.environ["NSTDATA_API_TOKEN"]url = os.environ["APPROVED_PAGE_URL"]with NstDataClient(token, max_response_bytes=1_048_576)as client: result = client.submit_scrape_task_sync(ScrapeRequestDto( url=url, formats=["markdown"], onlyMainContent=True, timeout=60000))if result.success isnotTrueor result.status !="completed":raise RuntimeError("Page task did not complete successfully")if result.data isNoneor result.data.truncated isTrue:raise RuntimeError("Missing or partial output needs review") markdown = result.data.get_markdown()ifnot markdown ornot markdown.strip():raise RuntimeError("No usable Markdown was returned") expected = os.environ.get("EXPECTED_TEXT")if expected and expected notin markdown:raise RuntimeError("Required source text is missing") Path("page.md").write_text(markdown, encoding="utf-8")print("Saved page.md; validate source facts before accepting records")
第 3 步:生成业务导出
根据适合源的规则将返回的表示解析为所需的列。对于已知的 HTML 表格,请请求 HTML 并应用经过测试的解析器;对于模型辅助提取,要求提供源证据并验证建议的字段。在将接受的行写入 CSV 或 JSON 之前,应用 结构化提取检查,保留 source_url 和 observed_at。
第 4 步:导入接受的文件
通过 Data → Get Data → From File → From Text/CSV 加载 CSV,或通过 Data → Get Data → From File → From JSON 加载 JSON,前提是 Excel 版本支持该连接器。仅展开所需的 JSON 记录字段。Json.Document 参考 描述 JSON 解析;解析对象并不验证其业务含义。
如何验证: 在刷新共享报告之前,调和接受的记录、源 URL 和刷新时间戳。收集失败时保留上一个接受的导出。