V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
theohateonion
V2EX  ›  Python

python urllib.quote()报错 Invalid percent-escape sequence?

  •  
  •   theohateonion · 2015-10-25 16:06:05 +08:00 · 2410 次点击
    这是一个创建于 3350 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:在写一个自动去射手网爬字幕的字幕搜索脚本

    代码如下

    import sys                                                                                               
    import urllib2                                                                                           
    import requests                                                                                          
    import re                                                                                                
    reload(sys)                                                                                              
    sys.setdefaultencoding("utf-8")                                                                          
    
    def download(searchname):                                                                                
        header = {                                                                                           
                'Host':'sub.makedie.me',                                                                     
                'Pragma':'no-cache',                                                                         
                'Referer':'http://sub.makedie.me/',                                                          
                'Upgrade-Insecure-Requests':'1',                                                             
                'User-Agent':'Mozilla/5.0 (X11; Linux x86_64)     AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36'}
        payload = {'searchword' : searchname}                                                                
        url = 'http://sub.makedie.me/sub/'                                                                      
        s = requests.Session()                                                                                  
        response = s.get(url,params=payload,headers=header)                                                     
        if response.status_code == requests.codes.ok:                                                           
            file = response.text                                                                                
        return file                                                                                             
    
    
    
    file_temp = open('filetemp.txt','w')                                                                        
    file_temp.write(download(urllib2.quote("绿箭侠 第三季 第 13 集 /Arrow.S03E13.720p.HDTV.X264-DIMENSION.chn")))
    

    出现问题:

    raise InvalidURL("Invalid percent-escape sequence: '%s'" % h)
     requests.exceptions.InvalidURL: Invalid percent-escape sequence: 'DI'
    

    检查之后去掉绿箭侠 第三季 第 13 集 /Arrow.S03E13.720p.HDTV.X264-DIMENSION.chn中'DI'前面的-后报错消失.

    求教产生这种错误的原因,或者有什么比较好的替代方法,新人第一次提问,有什么问题大家指出,虚心接受大家的批评~

    6 条回复    2015-10-26 07:38:33 +08:00
    lxy42
        1
    lxy42  
       2015-10-25 16:25:23 +08:00
    试试 quote_all()
    Sylv
        2
    Sylv  
       2015-10-25 17:24:37 +08:00   ❤️ 1
    脚本在我的 Mac 环境下并没有报这个错,所以我觉得很有可能是你的编码问题导致的,请尝试下以下步骤看看是否有效:
    1. 确保脚本文件是以 UTF-8 编码保存的。
    2. 脚本头部有正确的编码声明:# -*- coding: utf-8 -*-
    3. 去掉 reload(sys) 和 sys.setdefaultencoding("utf-8") 语句,这不是解决 Python 2 编码问题的正确方法,原因可见 /t/163786
    4. 去掉 urllib2.quote , requests 会自动帮你将 url 里的参数进行 quote ,不需要多此一举手动 quote 一次。
    5. 在中文字符串前加 u : u"绿箭侠 第三季 第 13 集 /Arrow.S03E13.720p.HDTV.X264-DIMENSION.chn"
    theohateonion
        3
    theohateonion  
    OP
       2015-10-25 18:58:52 +08:00
    @Sylv 我已经使用 request 自动传入成功了
    关于编码坑的解决真是受教了~
    theohateonion
        4
    theohateonion  
    OP
       2015-10-25 19:40:05 +08:00
    @Sylv 现在求教在 vim 怎么设置 Python build system 的环境变量
    Sylv
        5
    Sylv  
       2015-10-26 04:16:09 +08:00 via iPhone
    @theohateonion 你是什么系统?什么运行环境?我没用 vim ,你可以搜下对应环境下怎么设置 vin 的环境变量。
    theohateonion
        6
    theohateonion  
    OP
       2015-10-26 07:38:33 +08:00
    @Sylv h=好的 感谢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5862 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 02:23 · PVG 10:23 · LAX 18:23 · JFK 21:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.