You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

urllib.request.urlopen因URL来源不同触发编码错误的问题

解决urllib.request.urlopen抛出的UnicodeEncodeError问题

这个问题我之前也踩过坑,本质是从浏览器地址栏复制的URL里藏了个看不见的BOM字符(就是错误提示里的\ufeff),导致Python用ASCII编码处理时直接报错。

为什么会出现这个问题?

  • 部分浏览器在复制地址栏的URL时,会自动给字符串加上UTF-8 BOM(字节顺序标记)——这个字符肉眼完全看不到,但它不属于ASCII字符集,urllib.request.urlopen()在处理URL时会尝试用ASCII编码,自然就抛出UnicodeEncodeError了。
  • 而手动输入或者从网页文本(比如页面上的链接文本)复制的URL,是纯ASCII的干净字符串,没有这个隐藏字符,所以能正常执行请求。

几个快速解决方法:

  1. 精准移除BOM字符
    在传入urlopen之前,直接把字符串开头的\ufeff去掉就行:

    import urllib.request
    
    # 从浏览器复制的带BOM的URL
    raw_url = "http://www.google.com/"
    # 移除开头的BOM字符
    cleaned_url = raw_url.lstrip('\ufeff')
    # 正常发起请求
    response = urllib.request.urlopen(cleaned_url)
    
  2. 通用清理特殊字符
    如果担心还有其他非ASCII的隐藏字符,可以用编码忽略的方式清理:

    import urllib.request
    
    raw_url = "http://www.google.com/"
    # 转成ASCII并忽略无法编码的字符,再转回字符串
    cleaned_url = raw_url.encode('ascii', 'ignore').decode('ascii')
    response = urllib.request.urlopen(cleaned_url)
    
  3. 从根源避免
    以后复制URL时,尽量右键点击页面上的链接选择「复制链接地址」,或者直接手动输入URL,避开直接复制地址栏的内容(部分浏览器的这个小坑确实容易踩)。

内容的提问来源于stack exchange,提问作者jammertheprogrammer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:01:58