1. 最近在使用urllib时发现的一个问题,记录一下。
  2.  
  3. 首先请分别执行下面这两句代码:
      1"你好".encode("utf8").decode("gbk")
      2"你".encode("utf8").decode("gbk")
  4.  
  5. 结果:
      1、正常运行 只是输出是乱码
      2 报错 编码解析错误
  6.  
  7. 具体原因就不分析了,下面说一下造成的问题
  8.  
  9. urllib.parse.parse_qsl函数中
  1. def parse_qsl(qs, keep_blank_values=False, strict_parsing=False,
  2. encoding='utf-8', errors='replace'):
  3. """Parse a query given as a string argument.
  4.  
  5. Arguments:
  6.  
  7. qs: percent-encoded query string to be parsed
  8.  
  9. keep_blank_values: flag indicating whether blank values in
  10. percent-encoded queries should be treated as blank strings.
  11. A true value indicates that blanks should be retained as blank
  12. strings. The default false value indicates that blank values
  13. are to be ignored and treated as if they were not included.
  14.  
  15. strict_parsing: flag indicating what to do with parsing errors. If
  16. false (the default), errors are silently ignored. If true,
  17. errors raise a ValueError exception.
  18.  
  19. encoding and errors: specify how to decode percent-encoded sequences
  20. into Unicode characters, as accepted by the bytes.decode() method.
  21.  
  22. Returns a list, as G-d intended.
  23. """
  24. qs, _coerce_result = _coerce_args(qs)
  25. pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
  26. r = []
  27. for name_value in pairs:
  28. if not name_value and not strict_parsing:
  29. continue
  30. nv = name_value.split('=', 1)
  31. if len(nv) != 2:
  32. if strict_parsing:
  33. raise ValueError("bad query field: %r" % (name_value,))
  34. # Handle case of a control-name with no equal sign
  35. if keep_blank_values:
  36. nv.append('')
  37. else:
  38. continue
  39. if len(nv[1]) or keep_blank_values:
  40. name = nv[0].replace('+', ' ')
  41. name = unquote(name, encoding=encoding, errors=errors)
  42. name = _coerce_result(name)
  43. value = nv[1].replace('+', ' ')
  44. value = unquote(value, encoding=encoding, errors=errors)
  45. value = _coerce_result(value)
  46. r.append((name, value))
  47. return r
  1. 当解析出url中的参数后,会使用urllib.parse.unquote对参数名称和值分别做一下URL编码转换,于是问题就出现了
    根据上面的示例代码,偶数个中文编解码是不会报错的(在编码错误的情况下),下面分情况讨论:
    1、如果你很明确知道url参数中的编码方式是utf8或者gbk时,获取到的query中的value没有问题,你可以执行一个固定的编码。
    2、如果你的输入是不固定的,混杂着各种编码的时候,就蛋疼了,因为不会抛出异常,所以你只能发现结果中出现了各种乱码,却不知道问题出在那里
  2.  
  3. 貌似这并不是一个问题。。。
  4.  
  5. 只是在某些情况下用起来不太方便,例如:
      当你想把url中某些参数去掉,然后把剩下的拼接起来的时候还要重新quote一下
  6.  

urllib.parse.parse_qsl 的一个小问题的更多相关文章

  1. python3中的urllib.parse的常用方法

    将URL按一定的格式进行拆分 使用 urllib.parse.urlparse将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路径.参数.查询.片段 参照官方地址:https:// ...

  2. (转)Python3 模块3之 Urllib之 urllib.parse、urllib.robotparser

    原文:https://blog.csdn.net/qq_36148847/article/details/79153738 https://blog.csdn.net/zly412934578/art ...

  3. urllib.parse:很底层,但是是一个处理url路径的好模块

    介绍 urllib.parse是为urllib包下面的一个模块,urllib的其它模块完全可以使用requests替代.但是urlli.parse我们是有必要了解的,因为该模块下面有很多操作url路径 ...

  4. urllib.parse解析链接

    1. urlparse() 解析链接,注意,返回值比3多一个params的属性 from urllib.parse import urlparse result = urlparse('http:// ...

  5. 先定一个小目标,自己封装个ajax

    你是否发现项目中有很多页面只用到了框架不到十分之一的内容,还引了压缩后还有70多kb的jquery库 你是否发现项目中就用了两三个underscore提供的方法,其他大部分的你方法你甚至从来没有看过 ...

  6. 我与python3擦肩而过(三)—— 我去。。又是编码问题——urllib.parse.unquote

    记得初学python时就学的爬虫,经常遇到编码问题(其实在python3里面编码问题已经很少了...),用requests库就挺方便解决这些问题的.近来有共同学习python的程序员写了个电子书网站, ...

  7. urllib.parse

    1 url分解 import urllib.parse result = urllib.parse.urlparse('http://www.baidu.com') print(result) 结果为 ...

  8. urllib.parse.urlencode

    urllib.request.urlopen(url,data,timeout) 其中如果data被赋值,则请求的方式就会由get转为post,而post需要提供一些待处理的数据. 这些待处理的数据需 ...

  9. Python 的 urllib.parse 库解析 URL

      Python 中的 urllib.parse 模块提供了很多解析和组建 URL 的函数. 解析url urlparse() 函数可以将 URL 解析成 ParseResult 对象.对象中包含了六 ...

随机推荐

  1. 前端基础之BOM和DOM day52

    前端基础之BOM和DOM   前戏 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互 ...

  2. js验证前后密码是否一致,为什么当我输入不一致密码时,不会弹出警告啊

    <form name="form" action="#"><input type="password" id=" ...

  3. hdu 1026(BFS+输出路径) 我要和怪兽决斗

    http://acm.hdu.edu.cn/showproblem.php?pid=1026 模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时 ...

  4. TCP窗口扩大选项

    TCP窗口扩大选项(TCP Window Scale Option) TCP窗口扩大选项 TCP Window Scale Option (WSopt) 窗口扩大选项用于扩大TCP通告窗口,使TCP的 ...

  5. 20172325 2018-2019-1 《Java程序设计》第二周学习总结

    20172325 2018-2019-1 <Java程序设计>第二周学习总结 教材学习内容总结 3.1集合 集合是一种聚集.组织了其他对象的对象.集合可以分为两大类:线性集合和非线性集合. ...

  6. PHD实时数据对象

    PHD实时数据库在化工制造业的应用 PISDK 开发包  电力企业信息化

  7. JSP 9个内置对象

    JSP内置对象(隐式对象)是JSP容器为每个页面自动实例化的一组对象,开发者可直接使用,也被称为预定义变量. JSP容器提供了9个内置对象 request // javax.servlet.http. ...

  8. Servlet开发的三种方法

    第一种 实现 Servlet 接口,需要覆写 Servlet 的5个方法,并将ServletConfig对象保存到类级变量中 package app01a; import java.io.IOExce ...

  9. Getting svn to ignore files and directories

    August 27, 2013Software Developmentresources, subversion, svn, tutorial, version control Who knew it ...

  10. Spring Boot REST(一)核心接口

    Spring Boot REST(一)核心接口 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) SpringBoot RE ...