使用BeautifulSoup进行网页爬虫时如何处理UTF-8编码报错问题
错误原因
该UnicodeEncodeError报错不属于爬取或BeautifulSoup解析环节的问题,是Windows系统终端默认使用GBK(charmap)编码,打印输出时无法识别网页中包含的特殊Unicode字符(报错信息中的\u2605对应五角星符号)导致的。该错误仅在打印内容到终端时触发,不影响BeautifulSoup对象的查找、数据提取操作。
你之前将stats_page直接encode为UTF-8字节流的操作,会把BeautifulSoup对象转为无DOM操作方法的字节类型,自然无法调用findAll方法,属于错误的绕过方式。
你核心的爬取、解析、查找表格行代码本身完全正确,不需要调整,仅需处理打印输出环节的编码兼容即可。
解决方案
方案1:仅修改打印逻辑,不影响原有数据处理流程
打印时对输出内容做编码兼容,忽略无法识别的特殊字符即可,修改后完整代码如下:import pandas as pd import numpy as np from bs4 import BeautifulSoup import requests r = requests.get("https://www.playerprofiler.com/nfl/george-kittle").text stats_page = BeautifulSoup(r, 'lxml') column_headers_row = stats_page.findAll('tr') # 仅修改打印语句,兼容终端编码 print(str(column_headers_row).encode('gbk', errors='ignore').decode('gbk'))方案2:全局修改Python输出编码,一劳永逸解决同类问题
在代码最开头加入编码配置,指定Python标准输出使用UTF-8编码,后续所有打印操作都不需要额外处理:import sys import io # 全局配置输出编码为UTF-8 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') import pandas as pd import numpy as np from bs4 import BeautifulSoup import requests r = requests.get("https://www.playerprofiler.com/nfl/george-kittle").text stats_page = BeautifulSoup(r, 'lxml') column_headers_row = stats_page.findAll('tr') # 直接正常打印即可 print(column_headers_row)方案3:跳过打印环节直接处理数据
如果你不需要将内容输出到终端,完全可以直接对column_headers_row做遍历、提取字段、存入表格等后续操作,不会触发编码报错。
内容的提问来源于stack exchange,提问作者sfaisal
相关产品推荐
相关产品推荐

