如何让Python识别注册商标®符号?解决网页爬虫编码崩溃问题
解决Supreme爬取中注册商标符号导致的编码崩溃问题
看起来你在Python2环境下遇到了经典的Unicode编码问题——那些显示为“庐”的乱码其实是UTF-8编码的®符号被错误解码成GBK/GB2312编码导致的,而直接把Unicode字符串转成str(Python2中str是字节类型)时,默认用ASCII编码会抛出UnicodeEncodeError,直接导致程序崩溃。下面给你两种可行的解决思路:
方案1:正确处理编码,保留注册商标符号
既然你需要匹配商品名称,最好的方式是正确处理编码,避免信息丢失。在Python2中,BeautifulSoup返回的colour.text是Unicode字符串,直接转str会因为非ASCII字符报错,你可以这样做:
- 将Unicode字符串编码为UTF-8字节字符串后再存入列表:
for colour in soup.find_all('a', attrs={"class":"name-link"}, href=True): # 把Unicode编码为UTF-8字节,避免ASCII编码错误 CnI.append(colour.text.encode('utf-8')) Uhrefs.append(str(colour.get('href'))) # href一般是ASCII,转str没问题
- 更推荐的做法是全程使用Unicode字符串(包括你的目标匹配字符串),避免编码转换:
首先把你的目标商品名改成Unicode前缀:
Witem = u'2-Tone Nylon 6-Panel' Wcolour = u'Black'
然后直接存储Unicode字符串到列表:
for colour in soup.find_all('a', attrs={"class":"name-link"}, href=True): CnI.append(colour.text) # 保留Unicode,不转str Uhrefs.append(colour.get('href')) # BeautifulSoup返回的href也是Unicode
这样后续匹配时不会出现编码不一致的问题。
方案2:移除特殊符号,避免编码问题
如果你的商品匹配逻辑不需要保留®符号,可以直接移除它(或所有非ASCII字符):
- 精准移除注册商标符号(Unicode编码为
\u00AE):
for colour in soup.find_all('a', attrs={"class":"name-link"}, href=True): # 移除®符号后再转str clean_text = colour.text.replace(u'\u00AE', '') CnI.append(str(clean_text)) Uhrefs.append(str(colour.get('href')))
- 用正则移除所有非ASCII字符(适合处理多种特殊符号的情况):
先导入正则模块:
import re
然后修改循环:
for colour in soup.find_all('a', attrs={"class":"name-link"}, href=True): # 过滤所有非ASCII字符 clean_text = re.sub(r'[^\x00-\x7F]+', '', colour.text) CnI.append(str(clean_text)) Uhrefs.append(str(colour.get('href')))
另外提一句:你代码里的while Splitcounter<=len(CnI)逻辑看起来是假设CnI的元素是商品名和颜色交替的,但如果网站结构变化可能会出问题,建议用更可靠的方式解析商品和颜色的对应关系。
内容的提问来源于stack exchange,提问作者Reix
相关产品推荐
相关产品推荐

