将网页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




