You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

将网页HTML表格转为Pandas DataFrame并导出CSV失败求助

解决网页表格转Pandas DataFrame并导出CSV的问题

嘿,我瞅见你踩坑了——你直接把表格的纯文本丢给pd.DataFrame(),这肯定会失败啊!text_field[0].text返回的是一串毫无结构的字符串,Pandas根本没法把它自动拆分成行列分明的表格数据。咱们一步步来搞定这个问题:

先搞明白问题出在哪

你现在拿到的data是类似这样的纯文本(从截图能看出来是多行列的表格内容):

列名1 列名2 列名3
行1值1 行1值2 行1值3
行2值1 行2值2 行2值3
...

这种文本没有明确的列分隔规则,Pandas不知道怎么拆分,直接转DataFrame要么得到一列乱码,要么直接报错。

两种靠谱的解决方法

方法一:用BeautifulSoup解析HTML结构(灵活可控)

既然已经用Selenium拿到了渲染后的页面,不如直接解析表格的HTML标签,提取结构化的数据:

import time
from bs4 import BeautifulSoup
from selenium import webdriver
import pandas as pd

# Windows路径记得加r前缀,避免转义字符坑
url = 'http://www.altrankarlstad.com/wisp'
driver = webdriver.Chrome(r'C:\Users\rugupta\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.7\chromedriver.exe')
driver.get(url)
time.sleep(3)  # 不用等100秒,页面加载完就行,按需调整时长

# 把页面源码传给BeautifulSoup解析
soup = BeautifulSoup(driver.page_source, 'html.parser')
table = soup.find('table')  # 定位页面里的表格

# 提取表头和行数据
headers = [th.text.strip() for th in table.find_all('th')]
rows = []
# 跳过表头行,遍历所有数据行
for tr in table.find_all('tr')[1:]:
    row = [td.text.strip() for td in tr.find_all('td')]
    rows.append(row)

# 构建DataFrame并导出CSV
df = pd.DataFrame(rows, columns=headers)
df.to_csv('output.csv', index=False, encoding='utf-8')

# 别忘了关闭浏览器
driver.quit()

方法二:用Pandas的read_html直接解析(简单快捷)

如果表格结构比较标准,直接用Pandas自带的read_html就能自动识别页面里的表格:

import time
from selenium import webdriver
import pandas as pd

url = 'http://www.altrankarlstad.com/wisp'
driver = webdriver.Chrome(r'C:\Users\rugupta\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Python 3.7\chromedriver.exe')
driver.get(url)
time.sleep(3)

# read_html会返回所有表格的DataFrame列表,取第一个就行
dfs = pd.read_html(driver.page_source)
df = dfs[0]

df.to_csv('output.csv', index=False, encoding='utf-8')
driver.quit()

额外优化建议

  • 别用time.sleep(100)!太浪费时间了,改用Selenium的显式等待更靠谱:
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 最多等10秒,直到表格加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.TAG_NAME, 'table'))
    )
    
  • Windows路径一定要加r前缀,不然\会被当成转义字符导致路径错误。

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

火山引擎 最新活动