JavaScript批量提取网页表格数据:从DOM操作到自动化爬虫实战
1. 从“手动复制”到“一键收割”为什么我们需要批量提取网页表格数据作为一名和数据打交道的开发者我猜你肯定遇到过这样的场景领导甩过来一个网页链接说“小王把这个页面上的几十个表格数据都整理到Excel里下午开会要用”。或者你需要定期从某个公开的行业数据网站抓取最新的价格表、库存清单每次都得手动打开网页选中、复制、粘贴到表格软件再调整格式一套流程下来半小时就没了还容易出错。这就是我们今天要聊的核心痛点网页表格数据的批量、自动化提取。手动操作不仅效率低下在面对成百上千行数据或者需要定时抓取的场景时简直是灾难。而JavaScript作为在浏览器中“土生土长”的语言天然就是处理这个任务的最佳工具。它可以直接在浏览器环境中运行与网页的DOM文档对象模型无缝交互精准地定位到每一个table、tr、td元素将其中结构化的数据“收割”出来转换成我们熟悉的JSON、CSV等格式。最近的热搜词像“javascript map用法”、“table表格”、“el-table表格单选”等都反映了开发者们在处理表格数据时的具体困惑和需求。无论是处理传统的HTMLtable还是应对像Element UI、Ant Design这类现代UI框架生成的复杂表格组件其底层逻辑是相通的。本文的目的就是带你绕过那些零散的教程和坑系统地掌握使用JavaScript从简单到复杂从单个到批量稳健地提取网页表格数据的完整方案。无论你是前端新手想写个数据采集小工具还是后端同学需要临时处理一些网页数据这套方法都能让你事半功倍。2. 庖丁解牛深入理解网页表格的DOM结构在动手写代码之前我们必须像庖丁解牛一样彻底理解“牛”网页表格的骨架。网页上的表格本质上是由一系列具有特定语义的HTML标签嵌套构成的树形结构。只有摸清了它的脉络我们的代码才能精准下刀。2.1 核心HTML标签与属性一个最基础的HTML表格结构如下所示table idpriceTable classdata-table thead tr th产品名称/th th规格/th th单价元/th /tr /thead tbody tr td笔记本电脑A/td tdi7/16GB/512GB/td td6999/td /tr tr td显示器B/td td27英寸/4K/td td1999/td /tr /tbody tfoot tr td colspan3以上价格仅供参考/td /tr /tfoot /table我们来拆解一下关键部分table: 表格的根容器。我们通常通过它的id、class或其它属性来定位它尤其是在一个页面有多个表格时。例如document.querySelector(#priceTable)。thead,tbody,tfoot: 用于语义化地分组表格行。thead包含表头tbody包含主体数据绝大多数数据行在这里tfoot是表尾。注意不是所有表格都严格包含这三部分很多简单的表格可能只有tbody甚至直接就是tr放在table下。tr: 表格行Table Row。每一行数据都包裹在一个tr标签内。th: 表头单元格Table Header。通常出现在thead的tr里用于描述列的信息。它默认有加粗、居中的样式。td: 标准数据单元格Table Data。出现在tbody或tfoot的tr里存放具体的数据内容。关键属性colspan: 跨列。上面例子中tfoot里的td colspan“3”表示这个单元格横跨了3列。rowspan: 跨行。一个单元格占据多行的高度。>// 方法1使用 querySelector 返回第一个匹配的元素 const targetTable document.querySelector(table#dataReport); // 或更精确地 const targetTable document.querySelector(#dataReport); // 方法2使用 getElementById 专门用于ID效率通常很高 const targetTableById document.getElementById(dataReport); // 如果要获取页面上所有表格 const allTables document.querySelectorAll(table); // 或 const allTablesByTag document.getElementsByTagName(table);选择策略与心得querySelector/querySelectorAll功能更强大支持复杂的CSS选择器如table.data-table tbody tr:nth-child(odd)选择>function extractTableData(tableElement) { const data []; // 1. 获取所有数据行。这里假设数据都在tbody里直接取table下的所有tr可能包含thead和tfoot的行。 // 更稳健的做法是 const rows tableElement.tBodies[0]?.rows || tableElement.rows; const tbody tableElement.querySelector(tbody) || tableElement; // 如果没有tbody则用table本身 const rows tbody.querySelectorAll(tr); // 2. 获取表头可选用于构建带键名的对象 const headers []; const thead tableElement.querySelector(thead); if (thead) { const headerRows thead.querySelectorAll(tr); // 通常表头只有一行这里取最后一行有时表头有多行合并 const lastHeaderRow headerRows[headerRows.length - 1]; lastHeaderRow.querySelectorAll(th, td).forEach(cell { // 处理跨列如果colspan1则重复添加多次表头 const colspan parseInt(cell.getAttribute(colspan)) || 1; const headerText cell.textContent.trim(); for (let i 0; i colspan; i) { headers.push(headerText (colspan 1 ? _${i1} : )); } }); } // 3. 遍历每一数据行 rows.forEach(row { const rowData {}; const cells row.querySelectorAll(td); // 数据行通常用td // 如果之前提取了表头就构建键值对对象 if (headers.length 0 headers.length cells.length) { cells.forEach((cell, index) { const cellText cell.textContent.trim(); // 处理跨行如果rowspan1需要记录在后续行中跳过该位置此处简化复杂跨行需更复杂逻辑 rowData[headers[index]] cellText; }); data.push(rowData); } else { // 否则将行数据提取为数组 const cellArray Array.from(cells).map(cell cell.textContent.trim()); data.push(cellArray); } }); return { headers: headers.length 0 ? headers : null, rows: data }; } // 使用示例 const myTable document.querySelector(#myTable); const result extractTableData(myTable); console.log(result);关键点解析与避坑table.tBodies 这是一个非常实用的属性它返回表格中所有tbody元素的集合。即使HTML中没有显式写出tbody浏览器在解析时通常也会自动包裹一个。使用它可以避免把thead或tfoot里的行误当作数据。row.cellsvsrow.querySelectorAll(‘td’)HTMLTableRowElement有一个原生的cells属性它返回该行中所有td和th单元格的集合。在纯粹的数据行tbody内中使用cells更直接。但在混合场景下querySelectorAll(‘td’)目标更明确。文本清理cell.textContent获取的是包括子节点在内的所有文本比innerText更标准且性能更好。.trim()用于去除首尾空白字符这是数据清洗的第一步至关重要。跨行跨列 这是表格提取中最棘手的部分之一。上面的示例简单处理了colspan重复表头但rowspan的处理会更复杂因为它会影响后续行的单元格索引。一个完整的解决方案需要维护一个当前行的“单元格位置映射”遇到rowspan时在后续的对应行中预留空位或复制数据。对于复杂表格可能需要专门的库或更复杂的算法。4. 实战进阶应对复杂、动态与批量场景掌握了基础的单表提取后我们面对真实世界的挑战页面有多个结构各异的表格、数据是动态加载的、或者我们需要定时批量抓取数十个页面。这时候我们需要更强大的策略和工具。4.1 处理动态渲染的表格很多现代网站使用Ajax或Fetch动态加载表格数据。你打开页面时可能只看到一个骨架屏或加载动画稍后数据才填充进来。直接用之前的脚本在页面加载初期执行很可能什么都抓不到。解决方案使用MutationObserver或等待特定元素出现。MutationObserver是一个Web API用于监听DOM树的变化。我们可以监听表格所在容器当子节点发生变化即数据被插入时再触发提取逻辑。function extractTableWhenReady(containerSelector, tableSelector) { return new Promise((resolve) { const container document.querySelector(containerSelector); if (!container) { console.error(容器未找到); return resolve(null); } // 先检查一下表格是否已经存在 const existingTable container.querySelector(tableSelector); if (existingTable) { resolve(extractTableData(existingTable)); return; } // 如果不存在则设置监听器 const observer new MutationObserver((mutationsList, observer) { for (let mutation of mutationsList) { if (mutation.type childList) { const targetTable container.querySelector(tableSelector); if (targetTable) { observer.disconnect(); // 找到后停止监听 console.log(表格已动态加载开始提取...); resolve(extractTableData(targetTable)); return; } } } }); // 开始监听容器的子节点变化 observer.observe(container, { childList: true, subtree: true }); // 设置一个超时避免无限等待 setTimeout(() { observer.disconnect(); console.warn(等待表格超时); resolve(null); }, 10000); // 10秒超时 }); } // 使用示例假设数据会动态加载到 id 为 ‘app’ 的 div 下的一个 table 里 extractTableWhenReady(#app, table.data-grid).then(result { if (result) { console.log(提取到的动态数据, result); // 接下来可以处理数据例如导出为CSV exportToCsv(result.rows, result.headers); } });4.2 批量提取多个页面或同一页面多个表格“批量提取”意味着自动化循环。这通常需要结合浏览器自动化工具。场景一单页面内多个同类表格。如果页面里有多个结构相似的表格例如一个产品页面下有“规格参数”、“价格清单”、“用户评论”等多个表格我们可以一次性全部提取并区分。function extractAllSimilarTables(baseSelector table) { const tables document.querySelectorAll(baseSelector); const allResults []; tables.forEach((table, index) { // 可以添加一些过滤条件比如通过类名、前面的标题等来识别不同类型的表格 const tableName 表格_${index 1}; const data extractTableData(table); allResults.push({ name: tableName, ...data }); }); return allResults; } // 或者更精确地提取所有具有特定类名的表格 const reportTables document.querySelectorAll(table.report); const reportData Array.from(reportTables).map(extractTableData);场景二跨多个页面的批量提取。这是真正的“批量”需要自动化导航和抓取。此时单纯的前端JavaScript在浏览器控制台里就力不从心了。我们需要浏览器自动化工具。Puppeteer (Node.js) 谷歌官方无头Chrome工具功能强大。Playwright (Node.js/Python/Java/.NET) 微软出品支持多浏览器Chromium, Firefox, WebKitAPI现代。Selenium (多语言) 老牌自动化测试框架生态庞大。以下是一个使用Playwright (JavaScript)批量抓取多个页面表格的简化示例const { chromium } require(playwright); // 或使用 playwright/test (async () { const browser await chromium.launch({ headless: false }); // headless: true 为无头模式 const context await browser.newContext(); const page await context.newPage(); const urls [ https://example.com/page1, https://example.com/page2, // ... 更多URL ]; const allData []; for (const url of urls) { console.log(正在访问: ${url}); await page.goto(url, { waitUntil: networkidle }); // 等待页面加载完成 // 在页面上下文中执行我们的提取函数 const pageData await page.evaluate(() { // 这里的代码在浏览器环境中运行可以访问document const table document.querySelector(table.target-table); if (!table) return null; const data []; const rows table.querySelectorAll(tbody tr); rows.forEach(row { const cells row.querySelectorAll(td); const rowData Array.from(cells).map(cell cell.textContent.trim()); data.push(rowData); }); return data; }); if (pageData) { allData.push({ url, data: pageData }); } // 可选添加延迟避免请求过快 await page.waitForTimeout(2000); } console.log(所有数据提取完成:, JSON.stringify(allData, null, 2)); // 这里可以将allData保存为JSON文件或写入数据库 // const fs require(fs); // fs.writeFileSync(extracted_data.json, JSON.stringify(allData, null, 2)); await browser.close(); })();关键点page.evaluate() 这是在Node.js环境中将代码注入到浏览器页面上下文执行的关键函数。函数内的document就是当前页面的DOM。waitUntil: ‘networkidle’ 确保页面包括动态加载的数据完全加载完成后再执行提取这对SPA单页应用至关重要。反爬应对 批量抓取时要遵守网站的robots.txt并合理设置请求间隔waitForTimeout模拟人类操作。过于频繁的请求可能导致IP被封。4.3 数据清洗与格式化输出提取出来的原始文本数据往往需要清洗和转换。常见清洗操作去除多余空格和换行.trim()或用正则str.replace(/\s/g, ‘ ‘)。处理数字和货币 将“1,299.50”或“1.299,50 €”转换为数字1299.5。这需要复杂的正则表达式或专门的库如accounting.js。拆分合并的单元格内容 例如一个单元格内容是“红色/蓝色/绿色”可能需要拆分成数组[‘红色’ ‘蓝色’ ‘绿色’]。处理空值和默认值 将“-”、“N/A”转换为null或空字符串。格式化输出 清洗后的数据我们需要将其转换成有用的格式。JSON 最通用适合程序间交换。const jsonOutput JSON.stringify(extractedData, null, 2); // 可以直接复制或通过Blob对象让用户下载 function downloadJson(data, filename) { const blob new Blob([data], { type: application/json }); const url URL.createObjectURL(blob); const a document.createElement(a); a.href url; a.download filename; a.click(); URL.revokeObjectURL(url); }CSV 电子表格软件Excel Google Sheets最易导入的格式。function convertToCSV(dataArray, headers null) { const dataToUse headers ? [headers, ...dataArray] : dataArray; return dataToUse.map(row row.map(cell { // 处理CSV中的特殊字符逗号引号换行 let cellStr String(cell); if (cellStr.includes(,) || cellStr.includes() || cellStr.includes(\n)) { cellStr ${cellStr.replace(//g, )}; // 转义引号 } return cellStr; }).join(,) ).join(\n); } // 同样可以使用Blob和URL.createObjectURL进行下载设置type为text/csv直接复制到剪贴板 对于快速分享少量数据非常方便。function copyToClipboard(text) { navigator.clipboard.writeText(text).then(() { console.log(数据已复制到剪贴板); }).catch(err { console.error(复制失败: , err); }); } // 将CSV字符串复制 copyToClipboard(csvString);5. 避坑指南与性能优化在实际操作中你会遇到各种各样预料之外的问题。这里分享一些我踩过的坑和对应的解决方案。5.1 常见问题排查与解决问题querySelector返回null。原因1脚本执行时机过早。表格元素还未被加载到DOM中。解决 将脚本放在body标签末尾或使用DOMContentLoaded事件包装。document.addEventListener(DOMContentLoaded, function() { // 你的提取代码 });原因2选择器写错了或表格结构非标准。解决 在浏览器控制台使用$(你的选择器)Chrome或$$(你的选择器)查看所有测试选择器是否正确。仔细检查DOM结构特别是那些用div模拟的表格。问题提取到的数据是空的或者缺少行/列。原因1数据是动态加载的。如上文所述需要使用MutationObserver或等待策略。原因2表格使用了rowspan或colspan打乱了单元格索引。解决 实现一个能处理跨行跨列的解析器。思路是维护一个二维数组表示表格的“网格”解析每个单元格时根据其rowspan和colspan属性将其内容填充到网格的多个位置中。原因3表格内有input、select等表单元素你需要的是它们的值value而非显示文本。解决 在提取单元格内容时先检查内部是否有表单元素。function getCellContent(cell) { const input cell.querySelector(input, select, textarea); if (input) { return input.value || input.textContent; } return cell.textContent.trim(); }问题页面有JavaScript错误导致脚本不执行。解决 打开浏览器控制台F12查看Console标签页是否有报错。常见错误如“Uncaught TypeError: Cannot read property ‘querySelector’ of null”就是元素未找到。确保你的脚本在正确的上下文中运行例如浏览器扩展的内容脚本、书签脚本、或直接粘贴到控制台。5.2 性能考量与优化技巧当你需要处理一个拥有成千上万行数据的巨型表格时性能就变得重要了。减少DOM查询次数 DOM操作是相对昂贵的。避免在循环中重复查询。// 不佳每次循环都查询一次 for (let i 0; i rows.length; i) { const cells rows[i].querySelectorAll(td); // 每次循环都执行querySelectorAll } // 更佳一次性获取所有需要的数据 const rowData Array.from(rows).map(row { const cells row.querySelectorAll(td); // 对每行查询一次可以接受 return Array.from(cells).map(cell cell.textContent.trim()); });使用更高效的API 对于标准表格优先使用table.rows、row.cells、cell.textContent这些原生属性它们通常比通用的querySelector更快。分批处理与虚拟滚动 如果页面本身采用了虚拟滚动只渲染可视区域内的行你直接提取document下的所有行是提取不全的。这时需要模拟滚动让更多行加载出来。async function extractLargeTableWithScroll(tableSelector) { const table document.querySelector(tableSelector); let allRowsData []; let previousRowCount 0; while (true) { // 获取当前所有行 const currentRows table.querySelectorAll(tbody tr); if (currentRows.length previousRowCount) { // 行数不再增加可能已加载完毕或到底 console.log(数据加载似乎已完成); break; } // 提取新增的行简化处理这里提取所有 const newData Array.from(currentRows).slice(previousRowCount).map(row { const cells row.querySelectorAll(td); return Array.from(cells).map(cell cell.textContent.trim()); }); allRowsData allRowsData.concat(newData); previousRowCount currentRows.length; // 滚动到底部触发加载更多 table.scrollIntoView(false); // 滚动到表格底部 // 或者滚动表格的父容器 // table.parentElement.scrollTop table.parentElement.scrollHeight; // 等待新内容加载 await new Promise(resolve setTimeout(resolve, 1000)); // 等待1秒 } return allRowsData; } // 注意此函数需要在页面上下文中异步执行Web Worker 如果数据清洗和转换的计算量非常大例如解析复杂的财务数据可以考虑使用Web Worker在后台线程进行处理避免阻塞页面主线程。5.3 安全与合规性提醒最后也是最重要的一点尊重数据所有权和网站的使用条款。查看robots.txt 在目标网站的根目录下如https://example.com/robots.txt查看是否允许爬虫抓取你感兴趣的路径。Disallow: /意味着禁止所有爬虫。遵守rate limiting 在批量抓取时务必在请求之间添加显著的延迟如2-5秒避免对目标服务器造成DoS攻击般的压力。识别并遵守反爬机制 一些网站会使用验证码、登录墙、请求头校验、行为分析等技术来阻止自动化抓取。请勿尝试绕过这些机制尤其是用于商业目的时。对于公开数据考虑是否有官方API可用那通常是更稳定、更合规的获取方式。个人使用与学习 本文介绍的技术主要用于个人自动化、学习研究或处理自己有权限访问的数据。请勿将其用于侵犯他人权益、窃取商业机密或违反法律法规的用途。掌握了这些核心方法、进阶策略和避坑经验你应该能够应对绝大多数网页表格数据提取的需求了。从简单的控制台脚本到复杂的自动化爬虫思路都是一脉相承的理解结构、精准定位、稳健提取、妥善处理。剩下的就是在具体的项目中不断实践和优化了。

相关新闻

C语言:指针和数组

C语言:指针和数组

文章目录前言本文旨在系统性地介绍C语言中的指针和数组。一、数组名的理解1.1、认识数组名1.2、重新认识指针访问数组1.3、再谈字符指针二、一维数组传参和指针三、冒泡排序四、数组指针变量4.1、数组指针变量的定义4.2、数组指针变量的初始化五、二维数组传参和指针六、指针数…

2026/10/4 2:31:40 阅读更多 →
Java AI Agent框架解析:技术架构与实战应用

Java AI Agent框架解析:技术架构与实战应用

1. Java生态迎来AI Agent框架:技术变革还是概念炒作? 最近在开发者社区看到一个热议话题:Java终于有了自己的AI Agent框架。作为一名长期混迹Java生态的老兵,我第一反应是既兴奋又怀疑——兴奋的是Java在AI浪潮中终于不再缺席&…

2026/9/29 14:18:41 阅读更多 →
基于OpenClaw与SecGPT-14B的智能开源组件审计与SBOM自动生成实践

基于OpenClaw与SecGPT-14B的智能开源组件审计与SBOM自动生成实践

1. 项目概述:当开源审计遇上AI智能体 最近在搞软件供应链安全,最头疼的就是给项目里那一大堆开源组件做“人口普查”,生成一份准确、可用的SBOM(软件物料清单)。传统工具要么扫描不全,要么输出结果就是一堆…

2026/10/14 0:25:50 阅读更多 →

最新新闻

Agent-Reach:多Agent系统通信基础设施的设计与实战解析

Agent-Reach:多Agent系统通信基础设施的设计与实战解析

1. 从"三个Agent互相推诿"说起:Agent-Reach要解决的根子问题做多Agent系统做过一段时间的人,大概率都经历过这么一个荒诞场景:你搭了三个Agent,一个管订单解析,一个管库存查询,一个管售后策略&am…

2026/10/14 0:51:56 阅读更多 →
名企AI面试100题怎么刷?从知识梳理到复盘闭环的完整方法

名企AI面试100题怎么刷?从知识梳理到复盘闭环的完整方法

简介:《名企AI面试100题》是由七月在线团队从近4000道名企AI笔试/面试题中精挑细选、整理成册的PDF文档,面向正在准备算法工程师、机器学习工程师等AI岗位面试的求职者,以及希望系统复习计算机基础与AI核心知识的开发者。这份PDF共收100道典型…

2026/10/14 0:51:56 阅读更多 →
Flink CDC 3.0 实时同步 MySQL 到 Doris 全攻略

Flink CDC 3.0 实时同步 MySQL 到 Doris 全攻略

简介:面向具备一定Flink基础的大数据研发人员,这份由尚硅谷研究院编写的技术文档围绕Flink CDC 3.0展开,系统讲解CDC基本概念、基于查询与基于Binlog两类方式的差异,并重点演示flink-cdc-connectors组件从MySQL等数据库读取全量与…

2026/10/14 0:51:56 阅读更多 →
SPSS变量处理避坑指南:从数据录入到分析就绪的完整链路

SPSS变量处理避坑指南:从数据录入到分析就绪的完整链路

1. 变量视图里那些没人告诉你的事很多人学SPSS,第一步就卡在数据录入上。打开软件,看到“数据视图”和“变量视图”两个标签页,随手在数据视图里敲了几个数字,然后兴冲冲点“分析”,结果发现菜单里全是灰的&#xff0c…

2026/10/14 0:51:56 阅读更多 →
图像噪声去除实验:均值、中值与高斯滤波的PSNR/SSIM对比与调参

图像噪声去除实验:均值、中值与高斯滤波的PSNR/SSIM对比与调参

1. 图像噪声去除实验的整体设计思路数字图像处理这门课,实验环节往往比理论课更让人头疼。课本上给你一个公式,告诉你“用中值滤波可以去除椒盐噪声”,但真到动手写代码的时候,你会发现事情远没有那么简单——噪声类型怎么判断&am…

2026/10/14 0:51:56 阅读更多 →
LeetCode 543:二叉树直径的高效解法与JS实现

LeetCode 543:二叉树直径的高效解法与JS实现

1. 题目理解与需求分析今天要解决的是LeetCode第543题"二叉树的直径"。这是一道经典的二叉树遍历问题,题目描述很简单:给定一棵二叉树,你需要计算它的直径长度。二叉树的直径是指树中任意两个结点间最长路径的长度,这条…

2026/10/14 0:50:56 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →