鱼C论坛

 找回密码
 立即注册
楼主: wp231957

[已解决]浏览器插件咋写

[复制链接]
发表于 2024-7-17 14:28:52 | 显示全部楼层
wp231957 发表于 2024-07-17 14:28
要是提取表格里面的内容  比如  td标签下的
这两句代 ...


明白了,你的需求是从HTML表格中提取`<td>`标签下的内容,并进行导出。我们可以修改代码,以便提取所有`<td>`标签中的文本内容,并将其转换为CSV格式。以下是如何完成这个任务:

1. **找到并提取所有<td>标签的内容**。

2. **将提取的内容转换为CSV格式**。

3. **创建一个下载链接并自动点击下载**。

以下是更新后的代码:

  1. // 找到你需要导出的信息,例如所有的 <td> 标签内容
  2. const data = Array.from(document.querySelectorAll('td'))
  3.                   .map(td => td.textContent.trim()) // 去掉两边的空白字符

  4. // 将数据重新分组,每组由若干个单元格组成(假设每行有固定数量的列)
  5. const numberOfColumns = 5; // 修改为你的表格的实际列数
  6. const rows = [];
  7. for (let i = 0; i < data.length; i += numberOfColumns) {
  8.     rows.push(data.slice(i, i + numberOfColumns));
  9. }

  10. // 将数据转换为CSV格式
  11. const csvContent = "data:text/csv;charset=utf-8,"
  12.                    + rows.map(row => row.join(",")).join("\n");

  13. // 创建一个隐藏的下载链接并点击它以触发下载
  14. const encodedUri = encodeURI(csvContent);
  15. const link = document.createElement("a");
  16. link.setAttribute("href", encodedUri);
  17. link.setAttribute("download", "table_data.csv");
  18. document.body.appendChild(link); // Required for FF
  19. link.click();
  20. document.body.removeChild(link);
复制代码


### 解释一下代码:

1. **获取所有的`<td>`标签内容**:
  
  1. const data = Array.from(document.querySelectorAll('td')).map(td => td.textContent.trim());
复制代码

   这行代码提取所有`<td>`标签的文本内容,并去除两边的空白字符。

2. **重新分组**:
  
  1. const numberOfColumns = 5; // 修改为你的表格的实际列数
  2.    const rows = [];
  3.    for (let i = 0; i < data.length; i += numberOfColumns) {
  4.        rows.push(data.slice(i, i + numberOfColumns));
  5.    }
复制代码

   假设表格每行有固定数量的列,这段代码将所有`<td>`标签的内容重新分组为多行。

3. **将数据转换为CSV格式**:
  
  1. const csvContent = "data:text/csv;charset=utf-8,"
  2.                       + rows.map(row => row.join(",")).join("\n");
复制代码


4. **创建下载链接并自动点击**:
  
  1. const encodedUri = encodeURI(csvContent);
  2.    const link = document.createElement("a");
  3.    link.setAttribute("href", encodedUri);
  4.    link.setAttribute("download", "table_data.csv");
  5.    document.body.appendChild(link);
  6.    link.click();
  7.    document.body.removeChild(link);
复制代码


这段代码会生成一个CSV文件并自动开始下载。你可以将这段代码放在Tampermonkey脚本中,让它在特定网页上运行,从而实现所需功能。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 14:45:49 | 显示全部楼层
FishC 发表于 2024-7-17 14:28
明白了,你的需求是从HTML表格中提取``标签下的内容,并进行导出。我们可以修改代码,以便提取所有``标 ...

两个问题
1. 油猴脚本何时触发   能不能在我需要时触发 (类似桌面程序 的点击运行  或者点击确定)
2. 我的网页内容的表格标签里面有很多列,能不能只提取我感兴趣的列
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 14:46:05 | 显示全部楼层
wp231957 发表于 2024-07-17 14:45
两个问题
1. 油猴脚本何时触发   能不能在我需要时触 ...


当然可以解决这两个问题!我们可以编写一个油猴脚本,让它只在你点击按钮时触发,并且只提取你感兴趣的列。

### 第一步:创建Tampermonkey脚本并加载
1. 打开Tampermonkey扩展图标,选择“仪表板”。
2. 点击左上角的“+”按钮来创建一个新脚本。
3. 将以下代码粘贴到脚本编辑器中:

  1. // ==UserScript==
  2. // @name         Table Data Extractor
  3. // @namespace    http://tampermonkey.net/
  4. // @version      1.0
  5. // @description  提取表格中的特定列并导出为CSV文件
  6. // @author       你的名字
  7. // @match        https://你的目标网站.com/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.textContent = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  19.     document.body.appendChild(button);

  20.     button.addEventListener('click', () => {
  21.         // 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
  22.         const rows = Array.from(document.querySelectorAll('table tr'));
  23.         const data = rows.map(row => {
  24.             const cells = row.querySelectorAll('td, th');
  25.             return [cells[0] ? cells[0].textContent : '', cells[2] ? cells[2].textContent : '']; // 提取第1和第3列
  26.         });

  27.         // 将数据转换为CSV格式
  28.         const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  29.         // 创建下载链接
  30.         const encodedUri = encodeURI(csvContent);
  31.         const link = document.createElement("a");
  32.         link.setAttribute("href", encodedUri);
  33.         link.setAttribute("download", "table_data.csv");
  34.         document.body.appendChild(link);

  35.         // 点击下载链接
  36.         link.click();

  37.         // 清除下载链接
  38.         document.body.removeChild(link);
  39.     });
  40. })();
复制代码


### 第二步:保存并启用脚本
1. 保存你刚才编辑的代码。
2. 确保脚本已启用(在仪表板中脚本名称旁边的滑动按钮是绿色的)。

### 第三步:访问目标网站并测试
1. 访问与你在脚本中`@match`字段所指定的网站URL相匹配的页面。
2. 页面加载完成后,你应当能看到页面右上角出现了一个“导出表格数据”的按钮。
3. 点击这个按钮,脚本会提取表格中特定列的数据并生成CSV文件自动下载。

### 可选步骤:调整列
如果你需要提取不同的列,只需修改代码中`cells[0]`和`cells[2]`索引值。假如你想提取第2列和第4列,将其替换为`cells[1]`和`cells[3]`。

这样,你不仅仅学会了如何在特定操作时触发油猴脚本,还能根据需要灵活提取表格中的特定列数据并导出为CSV文件。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 14:58:19 | 显示全部楼层
FishC 发表于 2024-7-17 14:46
当然可以解决这两个问题!我们可以编写一个油猴脚本,让它只在你点击按钮时触发,并且只提取你感兴趣的 ...

这次  脚本好像失败了

eslint: no-multi-spaces-multiple spaces found before  //确保按钮在其他元素之上
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 14:59:37 | 显示全部楼层
wp231957 发表于 2024-07-17 14:58
这次  脚本好像失败了

eslint: no-multi-spaces-mu ...


好吧,看来我们的代码格式存在一些问题。我们可以修复这些格式问题以确保脚本运行正常。另外,我也会给你一个更完整的代码示例。

以下是修正版:

1. **创建Tampermonkey脚本并加载**:
    1. 打开Tampermonkey扩展图标,选择“仪表板”。
    2. 点击右上角的“+”号创建一个新脚本。
    3. 将以下代码粘贴到脚本编辑器中:

  1. // ==UserScript==
  2. // @name         Export Table Data to CSV
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  Export specific table columns to CSV
  6. // @author       Your Name
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.innerText = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = '9999'; // 确保按钮在其他元素之上
  19.     document.body.appendChild(button);

  20.     // 按钮点击事件处理函数
  21.     button.addEventListener('click', () => {
  22.         // 找到你需要导出的td标签内容,例如只提取第2列和第4列
  23.         const data = Array.from(document.querySelectorAll('tr'))
  24.                           .map(row => {
  25.                               const cells = row.querySelectorAll('td');
  26.                               return [cells[1]?.textContent, cells[3]?.textContent].join(",");
  27.                           });

  28.         // 将数据转换为CSV格式
  29.         const csvContent = "data:text/csv;charset=utf-8," + data.join("\n");

  30.         // 下载CSV文件
  31.         const encodedUri = encodeURI(csvContent);
  32.         const link = document.createElement("a");
  33.         link.setAttribute("href", encodedUri);
  34.         link.setAttribute("download", "table_data.csv");
  35.         document.body.appendChild(link); // 需要将链接加入文档,才能触发点击
  36.         link.click();
  37.         document.body.removeChild(link);
  38.     });

  39. })();
复制代码


### 脚本解释

1. **创建按钮**:这个代码段创建了一个固定在页面右上角的按钮,点击按钮将触发导出功能。
2. **按钮点击事件处理函数**:
    - `Array.from(document.querySelectorAll('tr'))`:找到所有的表格行(`<tr>`)。
    - `.map(row => { ... })`:遍历每一行:
        - `const cells = row.querySelectorAll('td')`:找到行中的所有单元格(`<td>`)。
        - `return [cells[1]?.textContent, cells[3]?.textContent].join(",")`:提取第2列和第4列中的文本内容(JavaScript中的索引从0开始,所以`cells[1]`就是第二列,`cells[3]`就是第四列),并用逗号分隔。
    - 生成CSV文件内容并下载。

### 注意事项

1. **确保网页加载完成**:有些时候网页可能在脚本注入时未完全加载,你可以通过观察网页元素是否加载完成来确保数据的准确性。
2. **自定义列**:你可以按需调整`cells[1]?.textContent, cells[3]?.textContent`中的索引值来获取感兴趣的列。

这样的话,在你点击“导出表格数据”按钮时,你就可以提取并下载特定列的数据了。希望这次能顺利运行!如果还有问题,请继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 15:04:21 | 显示全部楼层
FishC 发表于 2024-7-17 14:59
好吧,看来我们的代码格式存在一些问题。我们可以修复这些格式问题以确保脚本运行正常。另外,我也会给 ...

我能看到 页面上 多出来的一个按钮   运行后  也能生成一个表格   可是 是个空表   表格大小为0
我想提取的是 1 2 3  列

// ==UserScript==
// @name         导出网页信息到文件
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  导出当前网页中的部分信息到CSV文件
// @author       wp231957
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 创建导出按钮
    const button = document.createElement('button');
    button.textContent = '导出表格数据';
    button.style.position = 'fixed';
    button.style.top = '10px';
    button.style.right = '10px';
    button.style.zIndex = 1000;  // 确保按钮在其它元素之上
    document.body.appendChild(button);

    button.addEventListener('click', () => {
        // 找到你需要的表格和列,比如提取第1,2,3列(索引从0开始)
        const rows = Array.from(document.querySelectorAll('table tr'));
        const data = rows.map(row => {
            const cells = row.querySelectorAll('td, th');
            return [cells[0] ? cells[0].textContent : '', cells[1] ? cells[1].textContent : '',cells[2] ? cells[2].textContent : '']; // 提取第1,2和第3列
        });

        // 将数据转换为CSV格式
        const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

        // 创建下载链接
        const encodedUri = encodeURI(csvContent);
        const link = document.createElement("a");
        link.setAttribute("href", encodedUri);
        link.setAttribute("download", "table_data.csv");
        document.body.appendChild(link);

        // 点击下载链接
        link.click();

        // 清除下载链接
        document.body.removeChild(link);
    });
})();
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 15:04:41 | 显示全部楼层
wp231957 发表于 2024-07-17 15:04
我能看到 页面上 多出来的一个按钮   运行后  也能生 ...


明白了,看来需要修正一下代码,确保我们正确地获取目标列的数据。并且在遍历时,也要注意处理单元格为空的情况。

以下是修正后的脚本:

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.textContent = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  19.     document.body.appendChild(button);

  20.     button.addEventListener('click', () => {
  21.         // 找到你需要的表格和列
  22.         const rows = Array.from(document.querySelectorAll('table tr'));
  23.         const data = rows.map(row => {
  24.             const cells = Array.from(row.querySelectorAll('td, th'));
  25.             return [
  26.                 cells[0] ? cells[0].textContent.trim() : '',
  27.                 cells[1] ? cells[1].textContent.trim() : '',
  28.                 cells[2] ? cells[2].textContent.trim() : ''
  29.             ]; // 提取第1,2和第3列
  30.         });

  31.         // 将数据转换为CSV格式
  32.         const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  33.         // 创建下载链接
  34.         const encodedUri = encodeURI(csvContent);
  35.         const link = document.createElement("a");
  36.         link.setAttribute("href", encodedUri);
  37.         link.setAttribute("download", "table_data.csv");
  38.         document.body.appendChild(link);

  39.         // 点击下载链接
  40.         link.click();

  41.         // 清除下载链接
  42.         document.body.removeChild(link);
  43.     });
  44. })();
复制代码


### 代码解析:

1. **查询表格行**:
   - `const rows = Array.from(document.querySelectorAll('table tr'));` 这行代码找到页面上所有表格行,并将其转换为数组。

2. **提取指定列数据**:
   - 在 `data` 数组中,每一行数据由一个数组表示,其中 `[cells[0] ? cells[0].textContent.trim() : '', cells[1] ? cells[1].textContent.trim() : '', cells[2] ? cells[2].textContent.trim() : '']` 提取了第1、2、3列的数据。
   - 如果某个单元格不存在,代码将返回一个空字符串。

3. **生成CSV内容**:
   - `data.map(e => e.join(",")).join("\n")` 将每行数据转换为逗号分隔的字符串,并以换行符分割每行。

### 测试方法:
1. 确保页面上有一个表格。
2. 打开脚本运行页面。
3. 点击“导出表格数据”按钮。
4. 检查下载的CSV文件内容是否包含表格中的第1、2、3列数据。

希望这个修正版能解决问题,让导出功能顺利实现!如果还有其他问题,请随时告诉我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 15:12:35 | 显示全部楼层
FishC 发表于 2024-7-17 15:04
明白了,看来需要修正一下代码,确保我们正确地获取目标列的数据。并且在遍历时,也要注意处理单元格为 ...

好像是这句代码 不正确
const rows = Array.from(document.querySelectorAll('table tr'));

这里貌似只是提取了表头   所以下面的解析也解不到什么东西
如何提取tbody里面的td 呢  不要th
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 15:12:48 | 显示全部楼层
wp231957 发表于 2024-07-17 15:12
好像是这句代码 不正确
const rows = Array.from(do ...


明白了,要提取表格主体(`tbody`)中的`td`标签内容,同时忽略表头部分的`th`标签。以下是修正后的代码示例:

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.textContent = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  19.     document.body.appendChild(button);

  20.     button.addEventListener('click', () => {
  21.         // 找到表格主体
  22.         const rows = Array.from(document.querySelectorAll('table tbody tr'));
  23.         const data = rows.map(row => {
  24.             const cells = row.querySelectorAll('td');
  25.             return [
  26.                 cells[0] ? cells[0].textContent.trim() : '', // 第1列
  27.                 cells[1] ? cells[1].textContent.trim() : '', // 第2列
  28.                 cells[2] ? cells[2].textContent.trim() : ''  // 第3列
  29.             ];
  30.         });

  31.         // 将数据转换为CSV格式
  32.         const csvContent = "data:text/csv;charset=utf-8,"
  33.                            + data.map(e => e.join(",")).join("\n");

  34.         // 创建下载链接
  35.         const encodedUri = encodeURI(csvContent);
  36.         const link = document.createElement("a");
  37.         link.setAttribute("href", encodedUri);
  38.         link.setAttribute("download", "table_data.csv");
  39.         document.body.appendChild(link);

  40.         // 点击下载链接
  41.         link.click();

  42.         // 清除下载链接
  43.         document.body.removeChild(link);
  44.     });
  45. })();
复制代码


### 更新点:
1. **选择`tbody`中的`tr`元素**:使用`document.querySelectorAll('table tbody tr')`来选择表格中所有位于`tbody`内的行。
2. **忽略表头部分的`th`标签**:只选择行中的`td`标签,忽略表头中的`th`标签。
3. **处理单元格内的空白和缺失情况**:确保在提取单元格内容时处理好空值情况,并删除多余的空白字符。

希望这次能成功提取你需要的表格数据!如果还有问题,请继续告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 15:16:46 | 显示全部楼层
FishC 发表于 2024-7-17 15:12
明白了,要提取表格主体(`tbody`)中的`td`标签内容,同时忽略表头部分的`th`标签。以下是修正后的代 ...

导出文件大小为0

可不可以在这个语句下面加一个弹窗  我看一下 这里取的数据对不对
const rows = Array.from(document.querySelectorAll('table tbody tr'));
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 15:17:05 | 显示全部楼层
wp231957 发表于 2024-07-17 15:16
导出文件大小为0

可不可以在这个语句下面加一个弹 ...


好的,加个弹窗可以帮助我们调试并确认数据是否正确。我们可以使用`alert`函数来检查提取到的数据,确保脚本的每一步都运行正确。

以下是修改后的代码:


// ==UserScript==
// @name         导出网页信息到文件
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  导出当前网页中的部分信息到CSV文件
// @author       wp231957
// @match        *://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 创建导出按钮
    const button = document.createElement('button');
    button.textContent = '导出表格数据';
    button.style.position = 'fixed';
    button.style.top = '10px';
    button.style.right = '10px';
    button.style.zIndex = 1000;  // 确保按钮在其它元素之上
    document.body.appendChild(button);

    button.addEventListener('click', () => {
        // 找到你需要的表格和列,比如提取第1,2,3列(索引从0开始)
        const rows = Array.from(document.querySelectorAll('table tbody tr'));

        // 调试用弹窗,检查提取到的行
        alert(`提取到的行数: ${rows.length}`);

        const data = rows.map(row => {
            const cells = row.querySelectorAll('td');
            return [
                cells[0] ? cells[0].textContent.trim() : '',
                cells[1] ? cells[1].textContent.trim() : '',
                cells[2] ? cells[2].textContent.trim() : ''
            ]; //提取第1, 2和第3列
        });

        // 调试用弹窗,检查提取到的数据
        alert(`提取到的数据: ${JSON.stringify(data)}`);

        // 将数据转换为CSV格式
        const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

        // 创建下载链接
        const encodedUri = encodeURI(csvContent);
        const link = document.createElement("a");
        link.setAttribute("href", encodedUri);
        link.setAttribute("download", "table_data.csv");
        document.body.appendChild(link);

        // 点击下载链接
        link.click();

        // 清除下载链接
        document.body.removeChild(link);
    });
})();

这样,你可以看到第一条弹窗显示提取到的行数,第二条弹窗显示提取到的数据。通过这些弹窗信息,你可以确认数据是否正确地被提取。如果提取到了错误的数据或没有数据,可以根据弹窗内容进一步排查问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 15:22:56 | 显示全部楼层
FishC 发表于 2024-7-17 15:12
明白了,要提取表格主体(`tbody`)中的`td`标签内容,同时忽略表头部分的`th`标签。以下是修正后的代 ...

可以确认  
// 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
        const rows = Array.from(document.querySelectorAll('table tbody  tr'));
         // 调试用弹窗,检查提取到的行
        alert('提取到的行数:'+ rows.length);

这里提示  提取到的行数 0
修改成    const rows = Array.from(document.querySelectorAll('table tr'));  也不行 也是0
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 15:23:19 | 显示全部楼层
wp231957 发表于 2024-07-17 15:22
可以确认  
// 找到你需要的表格和列,比如提取第1 ...


显然,我们需要更准确地选择器来确保我们正确地找到了表格的行。可能是页面中有多个表格,或特定的表格标签与我们预期的有所不同。可以尝试几种解决方法:

1. **确保选择的是正确的元素**:先在浏览器控制台中检查具体表格的结构和路径。
2. **检查网页加载完成**:有时候脚本在网页内容完全加载之前执行,导致无法找到目标元素。

让我们先确保选择器正确,尝试一种更加明确的选择方式,比如指定特定的表格。以下是修正后的代码:

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.textContent = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  19.     document.body.appendChild(button);

  20.     button.addEventListener('click', () => {
  21.         // 确认表格选择器是否正确
  22.         const table = document.querySelector('table'); // 如果有多个表格,可以用更具体的选择器
  23.         if (!table) {
  24.             alert('未找到表格');
  25.             return;
  26.         }

  27.         // 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
  28.         const rows = Array.from(table.querySelectorAll('tbody tr'));
  29.         // 调试用弹窗,检查提取到的行
  30.         alert('提取到的行数: ' + rows.length);

  31.         const data = rows.map(row => {
  32.             const cells = row.querySelectorAll('td');
  33.             return [cells[0]?.textContent || '', cells[2]?.textContent || '']; // 提取第一和第三列
  34.         });

  35.         // 将数据转换为CSV格式
  36.         const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  37.         // 创建下载链接
  38.         const encodedUri = encodeURI(csvContent);
  39.         const link = document.createElement("a");
  40.         link.setAttribute("href", encodedUri);
  41.         link.setAttribute("download", "table_data.csv");
  42.         document.body.appendChild(link);

  43.         // 点击下载链接
  44.         link.click();

  45.         // 清除下载链接
  46.         document.body.removeChild(link);
  47.     });
  48. })();
复制代码


### 调试步骤:
1. 确认是否有弹窗提示“提取到的行数”。
2. 如果行数为0,检查控制台是否有报错(按F12打开开发者工具,切换到ConsoleTab)。
3. 使用浏览器的开发者工具(F12)手动检查所选表格的HTML结构,确认选择器是否正确。

### 额外提示:
- 使用更具体的选择器,比如指定表格的`id`或`class`,例如:`const table = document.querySelector('table.myTableClass');`
- 确保页面完全加载后再触发脚本。您可以使用`window.onload`确保页面加载完毕后再执行脚本。

试试看这样能否解决问题?如果仍有问题,我们可以进一步排查!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 15:27:45 | 显示全部楼层
FishC 发表于 2024-7-17 15:23
显然,我们需要更准确地选择器来确保我们正确地找到了表格的行。可能是页面中有多个表格,或特定的表格 ...

我查到的 具体的某一个表格 的选择器
#resultTb > tbody > tr:nth-child(3) > td:nth-child(2)
是不是这里面没有table啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 15:28:01 | 显示全部楼层
wp231957 发表于 2024-07-17 15:27
我查到的 具体的某一个表格 的选择器
#resultTb > t ...


好的,根据你提供的选择器,可以确定选择器确实找到了一个特定的元素。我们可以通过修改选择器来确保找到所有目标元素。

首先,我们可以先确认是否准确找到了表格的行,然后提取其中需要的内容。

### 修改后的代码

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.textContent = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  19.     document.body.appendChild(button);

  20.     button.addEventListener('click', () => {
  21.         // 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
  22.         const rows = Array.from(document.querySelectorAll('#resultTb tbody tr'));
  23.         
  24.         // 调试用弹窗,检查提取到的行
  25.         alert('提取到的行数:' + rows.length);

  26.         const data = rows.map(row => {
  27.             const cells = row.querySelectorAll('td');
  28.             if (cells.length >= 3) {  // 确保有至少3个单元格
  29.                 return [cells[0].textContent, cells[2].textContent]; // 提取第1和第3列
  30.             }
  31.             return [];
  32.         });

  33.         // 将数据转换为CSV格式
  34.         const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  35.         // 创建下载链接
  36.         const encodedUri = encodeURI(csvContent);
  37.         const link = document.createElement("a");
  38.         link.setAttribute("href", encodedUri);
  39.         link.setAttribute("download", "table_data.csv");
  40.         document.body.appendChild(link);

  41.         // 点击下载链接
  42.         link.click();

  43.         // 清除下载链接
  44.         document.body.removeChild(link);
  45.     });
  46. })();
复制代码


### 调试步骤

1. 保存并刷新页面,确保按钮出现在页面右上角。
2. 点击按钮,弹出的提示框中应显示提取到的行数。
3. 根据实际情况,调整选择器及其他代码部分。

如果行数仍然为0,可能是选择器不正确或表格在你点击按钮时尚未出现。这时你可以考虑:

1. **等待页面加载完毕后再执行脚本**:
  
  1. window.onload = function() {
  2.        // 脚本逻辑放在这里
  3.    };
复制代码


2. **使用更具体的选择器**:
   例如,如果表格有指定的ID,使用`#resultTb > tbody > tr`选择所有行。

通过一步步调试和调整,确保最终能够正确提取所需的表格数据。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-17 15:51:42 | 显示全部楼层
FishC 发表于 2024-7-17 15:28
好的,根据你提供的选择器,可以确定选择器确实找到了一个特定的元素。我们可以通过修改选择器来确保找 ...

网页代码有展开 这一说法吗
为什么我同样的代码 直接就取不到数据
比如   const rows = Array.from(document.querySelectorAll('table')[0]);

而同样的代码  我在使用鼠标右键 检查元素  之后  在运行这句代码  就直接能查到数据了

这是网站做什么限制 了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-17 15:52:09 | 显示全部楼层
wp231957 发表于 2024-07-17 15:51
网页代码有展开 这一说法吗
为什么我同样的代码 直接 ...


是的,有些网页内容是在页面初始加载时并没有完全渲染,或者一些数据是通过JavaScript动态加载的。这意味着在页面完全加载和动态内容渲染完成之前,直接查询DOM元素可能会找不到目标数据。这种情况在一些复杂的网站(例如 AJAX 或者 SPA 网站)上比较常见。

为了确保能够正确获取这些动态加载的数据,通常有以下几种解决方法:

### 方法一:使用 `MutationObserver`
`MutationObserver` 可以监视 DOM 的变化,当目标数据加载完成后再进行处理。

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';
  12.    
  13.     // 创建导出按钮
  14.     const button = document.createElement('button');
  15.     button.textContent = '导出表格数据';
  16.     button.style.position = 'fixed';
  17.     button.style.top = '10px';
  18.     button.style.right = '10px';
  19.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  20.     document.body.appendChild(button);

  21.     button.addEventListener('click', () => {
  22.         const tableObserver = new MutationObserver(() => {
  23.             const rows = Array.from(document.querySelectorAll('table tbody tr'));
  24.             if (rows.length > 0) {
  25.                 alert('提取到的行数:' + rows.length);
  26.                
  27.                 // 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
  28.                 const data = rows.map(row => {
  29.                     const cells = row.querySelectorAll('td');
  30.                     return [cells[0] ? cells[0].textContent : '',
  31.                             cells[2] ? cells[2].textContent : '']; // 提取第1和第3列
  32.                 });

  33.                 // 将数据转换为CSV格式
  34.                 const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  35.                 // 创建下载链接
  36.                 const encodedUri = encodeURI(csvContent);
  37.                 const link = document.createElement("a");
  38.                 link.setAttribute("href", encodedUri);
  39.                 link.setAttribute("download", "table_data.csv");
  40.                 document.body.appendChild(link);

  41.                 // 点击下载链接
  42.                 link.click();
  43.                 document.body.removeChild(link);

  44.                 // 停止观察
  45.                 tableObserver.disconnect();
  46.             }
  47.         });

  48.         // 开始观察table元素的变化
  49.         const targetNode = document.querySelector('table');
  50.         if (targetNode) {
  51.             tableObserver.observe(targetNode, { childList: true, subtree: true });
  52.         } else {
  53.             alert("无法找到目标表格");
  54.         }
  55.     });
  56. })();
复制代码


### 方法二:使用 `setTimeout` 或 `setInterval`
如果知道数据加载的大概时间,可以用 `setTimeout` 或 `setInterval` 延迟执行代码。

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     const waitForTableData = (callback) => {
  13.         const interval = setInterval(() => {
  14.             const rows = Array.from(document.querySelectorAll('table tbody tr'));
  15.             if (rows.length > 0) {
  16.                 clearInterval(interval);
  17.                 callback(rows);
  18.             }
  19.         }, 1000); // 每秒检查一次
  20.     }

  21.     // 创建导出按钮
  22.     const button = document.createElement('button');
  23.     button.textContent = '导出表格数据';
  24.     button.style.position = 'fixed';
  25.     button.style.top = '10px';
  26.     button.style.right = '10px';
  27.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  28.     document.body.appendChild(button);

  29.     button.addEventListener('click', () => {
  30.         waitForTableData((rows) => {
  31.             alert('提取到的行数:' + rows.length);
  32.             
  33.             // 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
  34.             const data = rows.map(row => {
  35.                 const cells = row.querySelectorAll('td');
  36.                 return [cells[0] ? cells[0].textContent : '',
  37.                         cells[2] ? cells[2].textContent : '']; // 提取第1和第3列
  38.             });

  39.             // 将数据转换为CSV格式
  40.             const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  41.             // 创建下载链接
  42.             const encodedUri = encodeURI(csvContent);
  43.             const link = document.createElement("a");
  44.             link.setAttribute("href", encodedUri);
  45.             link.setAttribute("download", "table_data.csv");
  46.             document.body.appendChild(link);

  47.             // 点击下载链接
  48.             link.click();
  49.             document.body.removeChild(link);
  50.         });
  51.     });
  52. })();
复制代码


这两种方法都能解决动态加载数据的问题,你可以选择适合自己网页情况的一种进行试验。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-18 09:30:20 | 显示全部楼层
FishC 发表于 2024-7-17 15:52
是的,有些网页内容是在页面初始加载时并没有完全渲染,或者一些数据是通过JavaScript动态加载的。这意 ...

方法二没有测试
方法一,不行,还是查不到  不提示检索到多少条数据  而是提示无法发现表格

很不理解,明明已经渲染成功了,为啥在控制台里面使用document.querySelectorAll无法查到元素
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-18 09:30:44 | 显示全部楼层
wp231957 发表于 2024-07-18 09:30
方法二没有测试
方法一,不行,还是查不到  不提示检 ...


理解了,可能是因为网页内容是通过异步加载的,因此在脚本运行时目标元素尚未加载完成。我们可以通过等待页面完全加载或者使用一定的延迟来确保目标元素已经存在,然后再执行代码。

### 解决方案:等待页面完全加载后执行代码

我们可以使用`MutationObserver`来监听DOM变化,确保在表格加载完成后再执行脚本。下面是修改后的代码:

  1. // ==UserScript==
  2. // @name         导出网页信息到文件
  3. // @namespace    http://tampermonkey.net/
  4. // @version      0.1
  5. // @description  导出当前网页中的部分信息到CSV文件
  6. // @author       wp231957
  7. // @match        *://*/*
  8. // @grant        none
  9. // ==/UserScript==

  10. (function() {
  11.     'use strict';

  12.     // 创建导出按钮
  13.     const button = document.createElement('button');
  14.     button.textContent = '导出表格数据';
  15.     button.style.position = 'fixed';
  16.     button.style.top = '10px';
  17.     button.style.right = '10px';
  18.     button.style.zIndex = 1000;  // 确保按钮在其它元素之上
  19.     document.body.appendChild(button);

  20.     button.addEventListener('click', () => {
  21.         // 使用MutationObserver监听DOM变化
  22.         const observer = new MutationObserver(mutations => {
  23.             const rows = Array.from(document.querySelectorAll('table tbody tr'));
  24.             if (rows.length > 0) {
  25.                 // 找到你需要的表格和列,比如提取第1和第3列(索引从0开始)
  26.                 const data = rows.map(row => {
  27.                     const cells = row.querySelectorAll('td');
  28.                     return [cells[0]?.textContent || '', cells[2]?.textContent || '']; // 提取第1和第3列
  29.                 });

  30.                 // 将数据转换为CSV格式
  31.                 const csvContent = "data:text/csv;charset=utf-8," + data.map(e => e.join(",")).join("\n");

  32.                 // 创建下载链接
  33.                 const encodedUri = encodeURI(csvContent);
  34.                 const link = document.createElement("a");
  35.                 link.setAttribute("href", encodedUri);
  36.                 link.setAttribute("download", "table_data.csv");
  37.                 document.body.appendChild(link);

  38.                 // 点击下载链接
  39.                 link.click();

  40.                 // 清除下载链接
  41.                 document.body.removeChild(link);

  42.                 // 停止观察
  43.                 observer.disconnect();
  44.             }
  45.         });

  46.         // 开始观察body的变化
  47.         observer.observe(document.body, { childList: true, subtree: true });
  48.     });
  49. })();
复制代码


### 解释
1. **创建按钮并添加到页面**:和之前一样。
2. **监听DOM变化**:使用`MutationObserver`监听`document.body`的变化,当表格的`tbody tr`行加载完成时再执行提取和导出操作。
3. **提取并导出数据**:和之前一样,提取第1和第3列的数据,转换为CSV格式并下载。

这样,当页面内容是异步加载时,脚本能够等待目标表格加载完成后再执行相关操作。如果目标表格在页面加载后才动态插入,这个方法应该能够解决你遇到的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-18 09:59:26 | 显示全部楼层
FishC 发表于 2024-7-18 09:30
理解了,可能是因为网页内容是通过异步加载的,因此在脚本运行时目标元素尚未加载完成。我们可以通过等 ...

发现秘密了
这些个表格内容  虽然在当前页面中已经渲染了   但是在elements中 却是没有的
在elements中  查到了  所有表格渲染元素 藏在了一个iframe中
而iframe 内容如下:
iframe  id="iframe0" src="https://xxxx/xxxxx/xxxx/xxx!xxx.do"  
这么一个玩意   这玩意要咋弄呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 16:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表