You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

问题根源

  1. 缺失表头:脚本仅提取<td>数据单元格,忽略了<th>表头标签,导致CSV无列名,LibreOffice识别时列对应关系混乱。
  2. 编码问题:默认以无BOM的UTF-8编码保存,LibreOffice打开时可能出现编码识别错误,导致内容显示异常。
  3. 数值格式错误: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}")

使用步骤

  1. 运行修正后的脚本,生成omaha_hilo_winrates.csv文件。
  2. 在LibreOffice Calc中打开该文件时,确认分隔符选择逗号,编码选择UTF-8。
  3. 选中WinHi %列,点击工具栏的「排序」按钮,即可按数值大小排序。

内容的提问来源于stack exchange,提问作者nadermx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:24:53