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
相关产品推荐
相关产品推荐

