urlparse
1
2
3
4
5
6
7
8
9from 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
9from 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
11from 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
6from 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类型。
区别:
不管
json
是str
还是dict
,如果不指定headers
中的content-type
,默认为application/json
data
为dict
时,如果不指定content-type
,默认为application/x-www-form-urlencoded
,相当于普通form表单提交的形式data
为str
时,如果不指定content-type
,默认为application/json
用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进行请求返回的数据带有类似
广州市天河
这样形式的数据时,这是进行了相应的HTML编码,我们可以使用python自带的html.parser
库来进行HTML解码:方法一(于Python3.5版本以上已失效):
1
2
3
4
5from html.parser import HTMLParser
a = '广州市天河'
h = HTMLParser()
print(h.unescape(a))
广州市天河
1 |
方法二(Python3.5以上版本推荐使用):
1 | import html |
方法三:直接利用BeautifulSoup的html.parser
解析库
1 | from bs4 import BeautifulSoup |