Python脚本提取网页表格并导出可排序CSV(适配LibreOffice)
Omaha Hi-Lo 预翻牌胜率表导出CSV并支持LibreOffice排序解决方案
问题背景
需要从指定网页提取表格并导出为CSV文件,目标是在LibreOffice中按WinHi %列进行排序。现有脚本可成功抓取表格数据,但导出的CSV在LibreOffice中显示异常,无法对目标列执行正确的数值排序。
现有问题脚本
脚本1(仅获取表格结构)
import requests import csv from bs4 import BeautifulSoup # 抓取网页HTML内容 url = 'https://caniwin.com/poker/omahahilopreALL.php' response = requests.get(url) html_content = response.text # 解析HTML soup = BeautifulSoup(html_content, 'html.parser') # 定位目标表格 table = soup.find('table') print(table)
脚本2(导出CSV但存在缺陷)
import requests import csv from bs4 import BeautifulSoup # 抓取网页HTML内容 url = 'https://caniwin.com/poker/omahahilopreALL.php' response = requests.get(url) html_content = response.text # 解析HTML soup = BeautifulSoup(html_content, 'html.parser') # 定位目标表格 table = soup.find('table') # 提取表格数据 table_data = [] for row in table.find_all('tr'): row_data = [] # 仅提取数据单元格,忽略表头 for cell in row.find_all(['td']): row_data.append(cell.text.strip()) table_data.append(row_data) # 导出到CSV filename = 'output.csv' with open(filename, 'w', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerows(table_data) print(f"表格数据已保存到 {filename}")
问题根源
- 缺失表头:脚本仅提取
<td>数据单元格,忽略了<th>表头标签,导致CSV无列名,LibreOffice识别时列对应关系混乱。 - 编码问题:默认以无BOM的UTF-8编码保存,LibreOffice打开时可能出现编码识别错误,导致内容显示异常。
- 数值格式错误:
WinHi %列内容为带百分号的文本(如35.2%),LibreOffice默认将其识别为文本类型,无法按数值逻辑排序。
修正后的脚本
import requests import csv from bs4 import BeautifulSoup # 抓取目标网页内容 url = 'https://caniwin.com/poker/omahahilopreALL.php' response = requests.get(url) soup = BeautifulSoup(response.text, 'html.parser') table = soup.find('table') # 提取所有行(包含表头) table_data = [] for row in table.find_all('tr'): # 同时提取表头<th>和数据<td>单元格 cells = row.find_all(['th', 'td']) row_data = [cell.text.strip() for cell in cells] table_data.append(row_data) # 定位WinHi %列的索引(用于后续格式处理) winhi_col_index = None if table_data: try: winhi_col_index = table_data[0].index('WinHi %') except ValueError: pass # 处理WinHi %列:去除百分号,转为可被LibreOffice识别的数值格式 if winhi_col_index is not None: # 跳过表头行,只处理数据行 for row in table_data[1:]: if winhi_col_index < len(row): cell_value = row[winhi_col_index] if '%' in cell_value: # 移除百分号,保留小数数字 row[winhi_col_index] = cell_value.replace('%', '') # 保存为带BOM的UTF-8 CSV,确保LibreOffice正确识别编码和列结构 output_filename = 'omaha_hilo_winrates.csv' with open(output_filename, 'w', newline='', encoding='utf-8-sig') as csv_file: writer = csv.writer(csv_file) writer.writerows(table_data) print(f"处理完成,数据已导出到 {output_filename}")
使用步骤
- 运行修正后的脚本,生成
omaha_hilo_winrates.csv文件。 - 在LibreOffice Calc中打开该文件时,确认分隔符选择逗号,编码选择UTF-8。
- 选中
WinHi %列,点击工具栏的「排序」按钮,即可按数值大小排序。
内容的提问来源于stack exchange,提问作者nadermx
相关产品推荐
相关产品推荐

