鱼C论坛

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

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

[复制链接]
发表于 2024-7-18 13:52:39 | 显示全部楼层
wp231957 发表于 2024-07-18 13:51
good
再添加一些
1.A B C 三列  自适应宽度
2、为 ...


明白了,下面我会提供一个完整的 Python 代码示例,展示如何使用 pandas 和 openpyxl 进行以下操作:

1. 从 CSV 文件读取数据,并允许自定义表头。
2. 对第一列序号进行重新赋值,从 1 开始排序。
3. 设置 A、B、C 三列的宽度为自适应。
4. 为数据区域添加表格框线。

首先,确保你已经安装了 pandas 和 openpyxl 库。如果还没有安装,可以通过以下命令进行安装:
pip install pandas openpyxl

然后使用以下代码:
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Border, Side
from openpyxl.utils import get_column_letter

# 读取 CSV 文件,允许自定义表头
def read_csv_with_header(file_path, custom_header=None):
    if custom_header is not None:
        df = pd.read_csv(file_path, header=None)
        df.columns = custom_header
    else:
        df = pd.read_csv(file_path)
    return df

# 示例 CSV 文件路径和自定义表头
csv_file_path = 'data.csv'
custom_header = ['A', 'B', 'C']  # 自定义表头

# 读取 CSV 文件
df = read_csv_with_header(csv_file_path, custom_header)

# 添加或重新赋值序号列
df.insert(0, '序号', range(1, len(df) + 1))

# 创建一个新的 Excel 工作簿
wb = Workbook()
ws = wb.active

# 将 DataFrame 写入 Excel 工作表
for r in dataframe_to_rows(df, index=False, header=True):
    ws.append(r)

# 自适应 A、B、C 三列宽度
for col in ['A', 'B', 'C']:
    max_length = 0
    column = ws[col]
    for cell in column:
        try:
            if len(str(cell.value)) > max_length:
                max_length = len(cell.value)
        except:
            pass
    adjusted_width = (max_length + 2)
    ws.column_dimensions[col].width = adjusted_width

# 为表格添加框线
thin_border = Border(left=Side(style='thin'),
                     right=Side(style='thin'),
                     top=Side(style='thin'),
                     bottom=Side(style='thin'))

for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=ws.max_column):
    for cell in row:
        cell.border = thin_border

# 保存 Excel 文件
excel_file_path = 'output.xlsx'
wb.save(excel_file_path)

print(f"Excel 文件已保存到 {excel_file_path}")

### 代码解释:
1. **读取 CSV 文件**:定义了 `read_csv_with_header` 函数来读取 CSV 文件,并允许用户传递自定义表头。
2. **序号列重新赋值**:通过 `df.insert` 方法在数据框的第一列插入序号列,序号从 1 开始。
3. **创建 Excel 工作簿**:使用 openpyxl 创建一个新的 Excel 工作簿,并将 DataFrame 写入工作表。
4. **自适应列宽**:遍历 A、B、C 三列,计算每列的最大字符长度并设置相应的列宽。
5. **添加表格框线**:为数据区域添加边框。
6. **保存 Excel 文件**:将最终的 Excel 文件保存到指定路径。

这样,你的 Excel 文件就有了自定义表头、序号列重新排序、自适应宽度以及表格框线。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 09:56:46 | 显示全部楼层
FishC 发表于 2024-7-18 13:52
明白了,下面我会提供一个完整的 Python 代码示例,展示如何使用 pandas 和 openpyxl 进行以下操作:
...

这是我另一个页面遇到的问题,这个页面比较简单  没有什么动态加载  也没有什么iframe
我用document.querySelectorAll("table")[1]  就可以检索到表格数据
但是 我想要的数据   都被他在td 下面 又用div包裹了一层     请问,这样 要取1 2 3 列数据  该
如何写油猴脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 09:59:02 | 显示全部楼层
wp231957 发表于 2024-07-19 09:56
这是我另一个页面遇到的问题,这个页面比较简单  没有 ...


明白了,我们要编写一个油猴脚本(Tampermonkey)来从网页表格中提取数据,特别是那些被 `div` 标签包裹的 `td` 元素中的数据。

以下是一个简单的油猴脚本示例,它会提取指定列的数据:
// ==UserScript==
// @name         Table Data Extractor
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Extract specific columns from table
// @author       You
// @match        http(s)://*/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 获取所有表格
    const tables = document.querySelectorAll("table");

    // 遍历所有表格
    tables.forEach((table, tableIndex) => {
        let data = [];

        // 获取表格所有行
        const rows = table.querySelectorAll('tr');
        
        rows.forEach((row, rowIndex) => {
            // 创建一个数组来存储这一行的选定列数据
            let rowData = [];

            // 获取行内所有单元格 (td)
            const cells = row.querySelectorAll('td');
            
            // 提取第1,2,3列的数据
            [0, 1, 2].forEach(colIndex => {
                if (cells[colIndex]) {
                    // 获取包裹在 div 内的文本
                    const cellText = cells[colIndex].querySelector('div') ? cells[colIndex].querySelector('div').innerText : cells[colIndex].innerText;

                    // 添加到 rowData 数组
                    rowData.push(cellText);
                }
            });

            // 将 rowData 添加到 data 数组
            if (rowData.length > 0) {
                data.push(rowData);
            }
        });

        console.log(`Table ${tableIndex + 1} Data:`, data);
    });
})();

### 脚本解析

1. **元数据块**:
   - 这部分包含一些油猴脚本的基础信息,如名称、作者、版本、匹配的URL等。

2. **核心函数**:
   - `const tables = document.querySelectorAll("table");`: 获取页面上的所有表格。
   - 遍历每个表格和其内部的行和单元格。
   - 使用 `querySelector('div')` 提取包裹在 `div` 内的文本内容。如果 `div` 不存在,则提取 `td` 的直接文本内容。
   - 将第1,2,3列的数据存储到 `rowData` 数组,并逐行添加到 `data` 数组中。

3. **日志输出**:
   - 使用 `console.log` 输出提取的数据,可以使用浏览器开发者工具查看。

这个脚本已经设置为提取每行的前3列数据,如果需要更多或不同的列,只需调整 `[0, 1, 2]` 中的索引即可。希望这个示例能帮助到你!如果有其他问题,随时提问哦。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 10:01:44 | 显示全部楼层
FishC 发表于 2024-7-19 09:59
明白了,我们要编写一个油猴脚本(Tampermonkey)来从网页表格中提取数据,特别是那些被 `div` 标签包 ...

麻烦按照这个格式写,最后要导csv的

// ==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 = '导出表格数据2';
    button.style.position = 'fixed';
    button.style.top = '10px';
    button.style.right = '10px';
    button.style.zIndex = 2000;  // 确保按钮在其它元素之上
    document.body.appendChild(button);

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

        // 调试用弹窗,检查提取到的行
        alert('提取到的行数:' + rows.length);

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

        // 将数据转换为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_data2.csv");
        document.body.appendChild(link);

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

        // 清除下载链接
        document.body.removeChild(link);
    });
})();
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 10:03:08 | 显示全部楼层
wp231957 发表于 2024-07-19 10:01
麻烦按照这个格式写,最后要导csv的

// ==UserScri ...


好的,让我们来编写这个油猴脚本。该脚本将从网页中的表格中提取数据,并将其导出为 CSV 文件。我们需要按照以下步骤进行:

1. 创建一个按钮,用于触发数据导出。
2. 找到表格和相关列的数据。
3. 将数据转换为 CSV 格式。
4. 生成一个下载链接,点击后触发 CSV 下载。

以下是完整的油猴脚本代码:
// ==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 = 2000;  // 确保按钮在其它元素之上
    document.body.appendChild(button);

    button.addEventListener('click', () => {
        // 找到你需要的表格和列
        const rows = Array.from(document.querySelectorAll('table tbody tr'));

        // 提取每行的第1、2和3列数据(假设要取的列数是固定的)
        const data = rows.map(row => {
            const cells = row.querySelectorAll('td div');
            if (cells.length >= 3) {  // 确保有至少3个单元格包裹div
                return [cells[0].textContent.trim(), cells[1].textContent.trim(), cells[2].textContent.trim()]; 
            }
            return [];
        }).filter(row => row.length > 0);  // 过滤掉空行

        // 将数据转换为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);
    });
})();

### 解释:
1. **创建按钮**:
   - 在页面上固定位置创建一个按钮,用户点击之后会触发数据导出功能。

2. **查找表格行和单元格**:
   - 使用 `document.querySelectorAll('table tbody tr')` 找到表格的所有行。
   - 对于每一行,使用 `row.querySelectorAll('td div')` 查找所有单元格内的 `div` 元素。

3. **提取数据**:
   - 从每个单元格的 `div` 中提取第1、2和3列的数据。
   - 使用 `.trim()` 去除多余的空格以保证数据干净。

4. **生成 CSV**:
   - 将提取的数据转换为 CSV 格式,并创建一个下载链接。
   - 自动点击下载链接,以便用户可以直接下载 CSV 文件。

希望这个脚本能帮助你顺利导出表格数据!如果有其他需求或者问题,随时欢迎提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 17:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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