Selenium爬取Instagram评论时format格式化xpath触发UnicodeEncodeError如何解决
错误成因
该错误结合硬编码序号可正常运行的特征,有两个核心触发原因:
- XPath字符串拼接冲突:你当前XPath中使用的
"是HTML转义格式的双引号,直接写死字符串时Python可自动解析匹配,但通过format()动态拼接时,转义字符和编码规则匹配异常,触发编码报错。 - Windows环境编码限制:如果你的运行环境为Windows,系统默认终端编码为GBK(即错误提示中的charmap),当你爬取到的评论包含emoji、小语种字符等特殊Unicode内容时,打印或写入默认编码文件时就会触发报错,你测试的序号1的评论刚好没有特殊字符,所以运行正常。
修复方案
1. 优先修正XPath拼接逻辑
把XPath内的转义双引号替换为单引号,调整字符串拼接方式,避免转义冲突:
# 用f-string构造XPath,避免format和转义字符的冲突 xpath = f'//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/div[1]/ul/ul[{i}]/div/li/div/div[1]/div[2]/span' comment = browser.find_element_by_xpath(xpath).get_attribute('textContent')
如果你使用的是Selenium 4.0+版本,旧版定位方法已废弃,需要改为browser.find_element(By.XPATH, xpath),提前导入from selenium.webdriver.common.by import By即可。
2. 适配Windows编码限制
如果修正XPath后仍然报错,做以下两处调整即可:
- 运行脚本前先在终端执行
chcp 65001,将终端编码切换为UTF-8 - 存储评论内容时,强制指定编码为UTF-8,示例:
# 写入文件时指定utf-8编码,避免特殊字符编码失败 with open('instagram_comments.csv', 'a', encoding='utf-8') as f: f.write(comment + '\n')
- 如果是打印内容时报错,可以增加容错处理:
print(comment.encode('utf-8', errors='ignore').decode('utf-8'))
3. 优化批量获取逻辑(可选)
不需要逐次构造序号XPath,可以一次性获取所有评论节点再遍历,稳定性更高:
# 一次性匹配所有评论节点 comment_nodes = browser.find_elements_by_xpath('//*[@id="react-root"]/section/main/div/div[1]/article/div[3]/div[1]/ul/ul/div/li/div/div[1]/div[2]/span') for node in comment_nodes: comment = node.get_attribute('textContent') # 后续处理逻辑
内容的提问来源于stack exchange,提问作者Mr Ikea
相关产品推荐
相关产品推荐

