urllib库的使用

  • urlparse

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from urllib.parse import urlparse, urlunparse

    result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
    print(result)

    ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')
    # 其中schema是协议,netloc是域名服务器,path是相对路径,params是参数,query是查询条件,fragment锚点

    # 相对应的将参数合并成完整url的方法为urlunparse(),共6个参数
  • urlsplit

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from urllib.parse import urlsplit,urlunsplit

    result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
    print(result)

    SplitResult(scheme='http', netloc='www.baidu.com', path='/index.html;user', query='id=5', fragment='comment')
    # 与urlparse类似,但是没有params返回值,合并在path里面

    # 对应的方法为urlunsplit(),共5个参数

    注:urlparse和urlsplit都有一个allow_fragments参数,默认为True;若设置为False,它会被解析为path,parameters或者query的一部分,而fragment部分为空

  • urlencode

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from urllib.parse import urlencode

    params = {
    'name' : 'germey',
    'age' : 22
    }
    base_url = 'http://www.baidu.com?'
    url = base_url + urlencode(params)
    print(url)

    http://www.baidu.com?name=germey&age=22

    一般当某个post请求的”Content-Type”为”application/x-www-form-urlencoded”时,需要对post_data进行urlencode(urlencode(post_data))

  • quote & unquote

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 该方法可以将内容转变成url编码的格式
    # 多数情况用于对中文字符进行编码
    from urllib.parse import quote

    keyword = '壁纸'
    url = 'http://www.baidu.coms?wd='+quote(keyword)
    print(url)

    http://www.baidu.coms?wd=%E5%A3%81%E7%BA%B8

    # 相对应的unquote可以进行url解码
    print(unquote(url))

    http://www.baidu.coms?wd=壁纸

    quote方法有个参数encoding,不同的encoding值,获取的url编码有一些不同

    1
    2
    3
    4
    5
    6
    from urllib.parse import quote
    quote("fu/fei/f34")
    'fu/fei/f34'
    # 第二个参数设置为空,可以将斜杠也转换
    quote("fu/fei/f34", "")
    'fu%2Ffei%2Ff34'
  • unicode

    有一些字符串的形式包含大量’\u’字符如(”2019\u5e74\u5e74\u62a5\u8868”),可以这样来转换成中文

    1
    2
    3
    4
    5
    # 前面的r很重要,将反斜杠的转义功能去除掉(或者使用双反斜杠)
    text = r'2019\u5e74\u5e74\u62a5\u8868'
    print(text.encode().decode('unicode_escape'))

    '2019年年报表'
  • requests.post()

    在通过requests.post()进行POST请求时,传入报文的参数有两个,一个是data,一个是json。
    data与json既可以是str类型,也可以是dict类型。
    区别:

  1. 不管jsonstr还是dict,如果不指定headers中的content-type,默认为application/json

  2. datadict时,如果不指定content-type,默认为application/x-www-form-urlencoded,相当于普通form表单提交的形式

  3. datastr时,如果不指定content-type,默认为application/json

    1. 用data参数提交数据时,request.body的内容则为a=1&b=2的这种形式,用json参数提交数据时,request.body的内容则为’{“a": 1, "b": 2}'的这种形式(对应Post_man中的raw形式);

      使用data参数也可以实现body内容为’{“a": 1, "b": 2}'的形式,方式为data=json.dumps(post_data)

在Chrome浏览器中,查看post请求下面的Form Data时,选择view soure可以看到post的数据的形式,若为a=1&b=2的形式,一般使用data参数;若为{“a”: 1, “b”: 2}的形式,一般使用json参数。

当然浏览器中显示的形式也有可能是“假的”,当我们采用常规的方式请求不成功时,可以把以上几种形式都尝试下。

  • html.parser

    当我们对某url进行请求返回的数据带有类似广州市天&#27827这样形式的数据时,这是进行了相应的HTML编码,我们可以使用python自带的html.parser库来进行HTML解码:

    方法一(于Python3.5版本以上已失效):

    1
    2
    3
    4
    5
    from html.parser import HTMLParser

    a = '广州市天&#27827'
    h = HTMLParser()
    print(h.unescape(a))

广州市天河

1
 

方法二(Python3.5以上版本推荐使用):

1
2
3
4
5
6
import html

a = '广州市天&#27827'
text = html.unescape(a)
print(text)
>>> 广州市天河

方法三:直接利用BeautifulSoup的html.parser解析库

1
2
3
4
from bs4 import BeautifulSoup

# response_text一般是获取的html代码,包含的文字被HTML编码了,可以使用此种方式
soup = BeautifulSoup(response_text, 'html.parser')