Python3获取网页源码时遇UnicodeEncodeError问题求助
解决Selenium获取IMDB页面时的UnicodeEncodeError问题
首先得说清楚:你遇到的这个UnicodeEncodeError根本不是page_source的获取问题——问题出在Windows控制台的默认编码限制!Windows命令行默认用cp1252编码,没法处理像\u25ec这类特殊Unicode字符,和你对page_source做utf-8编码没关系。下面给你几个实用的解决办法:
方法一:强制标准输出用UTF-8(Python 3.7+适用)
在代码开头加两行配置,让打印输出强制使用utf-8编码,之后正常打印就不会报错了:
from selenium import webdriver from bs4 import BeautifulSoup import sys # 配置标准输出为utf-8编码 sys.stdout.reconfigure(encoding='utf-8') driver = webdriver.Chrome(executable_path=r'C:\chromedriver_win32\chromedriver.exe') driver.get('https://www.imdb.com/') html_doc = driver.page_source soup = BeautifulSoup(html_doc, 'lxml') print(soup.prettify()) driver.quit()
方法二:把内容写入文件(最稳妥的方式)
控制台编码限制多,不如直接把格式化后的源码写入utf-8编码的文件,既保存了内容,又完全避开编码问题:
from selenium import webdriver from bs4 import BeautifulSoup driver = webdriver.Chrome(executable_path=r'C:\chromedriver_win32\chromedriver.exe') driver.get('https://www.imdb.com/') html_doc = driver.page_source soup = BeautifulSoup(html_doc, 'lxml') # 将内容写入utf-8编码的本地文件 with open('imdb_formatted_source.html', 'w', encoding='utf-8') as file: file.write(soup.prettify()) driver.quit()
执行完直接打开生成的imdb_formatted_source.html文件,就能看到完整的格式化源码了。
方法三:打印时手动转码(兼容低版本Python)
如果你的Python版本低于3.7,没法用sys.stdout.reconfigure,可以在打印时手动把字符串转成utf-8字节串输出:
# 替换原有的print语句 print(soup.prettify().encode('utf-8'))
不过这种方式打印出来的是字节串(开头带b'),可读性稍差,优先推荐前两种方法。
为什么你之前的尝试没用?
driver.page_source本身就是Unicode字符串,你把它encode成utf-8字节串后,BeautifulSoup会自动解码回Unicode,最后打印时还是会触发控制台的编码限制——问题根源从来不在page_source的获取上,而是输出环节的编码不匹配。
内容的提问来源于stack exchange,提问作者Buddhika Chathuranga
相关产品推荐
相关产品推荐

