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

WebScraping问题:Pandas to_excel无法完整显示DataFrame

嘿,我来帮你搞定这两个问题!咱们先从代码逻辑的问题入手,再解决Excel显示的异常:

1. 仅获取到前9个分类的问题

你的代码里有两个明显的逻辑错误,导致只拿到了部分分类:

  • 变量element根本没定义,你应该是想写li.find('li'),但即使修正这个,外层的side_categories对应的li下面是一个包含所有分类的嵌套列表,你现在的循环只遍历了最外层的li,没深入到子分类里。
  • 你的去重逻辑也没必要,因为每个分类都是唯一的,直接收集就行。

修正后的循环部分应该改成这样:

# 先定位到侧边栏的分类容器
side_categories = soup.find('div', class_='side_categories')
# 遍历容器里所有的li标签(包括嵌套的子li)
for li in side_categories.find_all('li', recursive=True):
    # 提取分类文本,同时去掉多余的空格和换行
    category_name = li.get_text(strip=True)
    # 过滤掉空文本(避免收集到无效内容)
    if category_name:
        results.append(category_name)

这样就能拿到网站上所有的书籍分类了,不止前9个~

2. Excel显示异常(需切换列查看)的问题

这个是Excel默认列宽不够导致的——长文本被压缩隐藏了,而CSV是纯文本格式,所以不会有这个问题。有两种解决方法:

方法一:代码自动设置列宽(推荐)

需要先安装openpyxl库(pip install openpyxl),然后在导出时自动调整列宽:

import pandas as pd
from openpyxl import load_workbook

# 先把DataFrame导出到Excel
df.to_excel('categories.xlsx', index=False, engine='openpyxl')

# 加载导出的文件,调整列宽
wb = load_workbook('categories.xlsx')
ws = wb.active

# 遍历每一列,计算最大宽度后设置列宽
for column_cells in ws.columns:
    max_length = 0
    column_letter = column_cells[0].column_letter  # 获取列的字母标识(比如A、B)
    for cell in column_cells:
        try:
            if len(str(cell.value)) > max_length:
                max_length = len(str(cell.value))
        except:
            pass
    # 给列宽留一点余量,避免文字挤在一起
    ws.column_dimensions[column_letter].width = max_length + 2

wb.save('categories.xlsx')

方法二:手动调整(临时方案)

如果不想改代码,打开导出的Excel文件,选中所有列,双击列标题之间的分隔线,Excel会自动把列宽调整到适合内容的宽度。

额外优化建议

其实这个网站是静态页面,不需要用Selenium启动浏览器,直接用requests+BeautifulSoup就能爬取,速度更快也更轻便:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = 'http://books.toscrape.com/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

results = []
side_categories = soup.find('div', class_='side_categories')
for li in side_categories.find_all('li', recursive=True):
    category_name = li.get_text(strip=True)
    if category_name:
        results.append(category_name)

df = pd.DataFrame({'Categories': results})
# 然后用上面的方法导出并调整列宽即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:31:14