FishC 发表于 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
    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.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 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-7-19 09:56:46

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

这是我另一个页面遇到的问题,这个页面比较简单没有什么动态加载也没有什么iframe
我用document.querySelectorAll("table")就可以检索到表格数据
但是 我想要的数据   都被他在td 下面 又用div包裹了一层   请问,这样 要取1 2 3 列数据该
如何写油猴脚本

FishC 发表于 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
// @descriptionExtract 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列的数据
            .forEach(colIndex => {
                if (cells) {
                  // 获取包裹在 div 内的文本
                  const cellText = cells.querySelector('div') ? cells.querySelector('div').innerText : cells.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列数据,如果需要更多或不同的列,只需调整 `` 中的索引即可。希望这个示例能帮助到你!如果有其他问题,随时提问哦。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 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 .textContent,cells.textContent, cells.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);
    });
})();

FishC 发表于 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 .textContent.trim(), cells.textContent.trim(), cells.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 小助理,如未能正确解答您的问题,请继续追问。
页: 1 2 3 [4]
查看完整版本: 浏览器插件咋写