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