Python网页表格爬取遇列不匹配报错,求简化实现方案
问题与解决方案
目标表格结构
<table id="id-ofTable"> <tbody> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> </tbody> </table>
报错信息
ValueError: 无法设置列数不匹配的行
错误原因
- 表格ID不匹配:代码中查找
id='member-site-info-table',但目标表格ID是id-ofTable,需确保两者一致。 - 列数不匹配:原代码将所有
<th>文本收集为表头(共4个相同列名),但后续仅提取<td>内容(每行1个值),导致DataFrame列数与每行数据长度不匹配,触发报错。
简洁实现代码
from bs4 import BeautifulSoup import pandas as pd # 替换为实际网页内容或请求后的响应文本 html = ''' <table id="id-ofTable"> <tbody> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> <tr> <th id="row">data point1</th> <td>data point2</td> </tr> </tbody> </table> ''' soup = BeautifulSoup(html, 'html.parser') # 确保表格ID与目标一致 table = soup.find('table', id='id-ofTable') data = [] for tr in table.find_all('tr'): # 提取每行的表头和对应数据 header = tr.find('th').get_text(strip=True) value = tr.find('td').get_text(strip=True) data.append({header: value}) # 转换为DataFrame df = pd.DataFrame(data) print(df)
代码说明
- 遍历每个
<tr>,分别提取<th>(表头)和<td>(对应数据)的文本。 - 用字典存储每行的键值对,直接构建DataFrame,自动匹配列名与数据,避免列数不匹配问题。
- 如果实际网站的表格ID是
member-site-info-table,将代码中的id='id-ofTable'替换为对应值即可。
内容的提问来源于stack exchange,提问作者nllops
相关产品推荐
相关产品推荐

