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标签的逻辑冗余,容易取到错误链接。
修复方案
- 拿到requests响应后手动指定编码为UTF-8,保证内容解码正确
- 调用pandas的
to_csv()方法时指定编码为utf-8-sig,适配办公软件读取不会乱码 - 修正库存、链接提取的逻辑问题,保证数据准确性
修正后的完整代码
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
相关产品推荐
相关产品推荐

