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

Python爬取books.toscrape.com价格列出现多余特殊字符问题求解

问题根源
  • 编码解码不匹配:目标网页采用UTF-8编码,你调用requests.get()获取响应后直接使用.text属性时,requests会自动猜测响应编码,该网站响应头未明确指定编码的情况下,requests默认使用ISO-8859-1编码解码内容。UTF-8编码下的英镑符号£占2个字节,用ISO-8859-1解码时会被拆为Â和£两个字符,就是你看到的异常前缀。
  • CSV导出多逗号:你导出CSV时未指定适配办公软件的编码,默认的UTF-8编码文件用Excel打开时,系统默认用GBK/ASCII编码解析,编码错位导致多余字节被识别为逗号分隔符。
  • 额外逻辑问题:原代码提取库存时使用Scrape.find全局查找,会导致所有商品库存都取当前页第一个商品的库存;提取详情页链接循环所有a标签的逻辑冗余,容易取到错误链接。
修复方案
  1. 拿到requests响应后手动指定编码为UTF-8,保证内容解码正确
  2. 调用pandas的to_csv()方法时指定编码为utf-8-sig,适配办公软件读取不会乱码
  3. 修正库存、链接提取的逻辑问题,保证数据准确性
修正后的完整代码
import requests
from bs4 import BeautifulSoup
import pandas as pd
URL = 'https://books.toscrape.com/catalogue/page-'

books=[]
Price=[]
Stock_availability=[]
Books_url=[]
# 循环爬取多页数据
for page in range(1,6):
    Source = requests.get(URL + str(page) + '.html')
    # 手动指定响应编码为UTF-8,解决乱码问题
    Source.encoding = 'utf-8'
    Scrape = BeautifulSoup(Source.text,'html.parser')

    for article in Scrape.find_all('article'):
        # 提取书籍标题
        books.append(article.h3.a.text)
        # 提取书籍价格
        Price.append(article.find('div', class_ = 'product_price').p.text)
        # 提取每本书的库存状态,改为从当前商品节点查找
        Stock = article.find('p', class_ = 'instock availability').text.strip()
        Stock_availability.append(Stock)
        # 直接提取标题对应的详情页链接,无需循环所有a标签
        url = article.h3.a['href']
        Books_url.append('https://books.toscrape.com/catalogue/' + url)
         
Scraped_Data = {'TITLE':books,'PRICE':Price,'STOCK AVAILABILTY':Stock_availability,'URL':Books_url}
Scraped_Books = pd.DataFrame(Scraped_Data)
# 导出时指定utf-8-sig编码,解决Excel打开乱码、多逗号问题
Scraped_Books.to_csv('SCB.csv',index = None, encoding='utf-8-sig')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:21:02