Python爬蟲之urllib.parse詳解

Python爬蟲之urllib.parsedom

轉載地址函數

Python 中的 urllib.parse 模塊提供了不少解析和組建 URL 的函數。url

解析url

解析url( urlparse() )

urlparse() 函數能夠將 URL 解析成 ParseResult 對象。對象中包含了六個元素,分別爲:spa

協議(scheme) 
域名(netloc) 
路徑(path) 
路徑參數(params) 
查詢參數(query) 
片斷(fragment)

 

from urllib.parse import urlparse

url='https://blog.csdn.net/xc_zhou/article/details/80907101'

parsed_result=urlparse(url)

print('parsed_result 包含了',len(parsed_result),'個元素')
print(parsed_result)

print('scheme  :', parsed_result.scheme)
print('netloc  :', parsed_result.netloc)
print('path    :', parsed_result.path)
print('params  :', parsed_result.params)
print('query   :', parsed_result.query)
print('fragment:', parsed_result.fragment)
print('username:', parsed_result.username)
print('password:', parsed_result.password)
print('hostname:', parsed_result.hostname)
print('port    :', parsed_result.port)

結果爲:.net

parsed_result 包含了 6 個元素
ParseResult(scheme='http', netloc='user:pwd@domain:80', path='/path', params='params', query='query=queryarg', fragment='fragment')
scheme  : http
netloc  : user:pwd@domain:80
path    : /path
params  : params
query   : query=queryarg
fragment: fragment
username: user
password: pwd
hostname: domain
port    : 80

 

 

解析url( urlsplit() )

 urlsplit() 函數也能對 URL 進行拆分,所不一樣的是, urlsplit() 並不會把 路徑參數(params) 從 路徑(path) 中分離出來。
當 URL 中路徑部分包含多個參數時,使用 urlparse() 解析是有問題的code

這時能夠使用 urlsplit() 來解析:對象

from urllib.parse import urlsplit
url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'

split_result=urlsplit(url)

print(split_result)
print('split.path    :', split_result.path)
# SplitResult 沒有 params 屬性

結果爲:blog

SplitResult(scheme='http', netloc='user:pwd@domain:80', path='/path1;params1/path2;params2', query='query=queryarg', fragment='fragment')
split.path    : /path1;params1/path2;params2

 

解析url(urldefrag())

from urllib.parse import urldefrag

url = 'http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment'

d = urldefrag(url)
print(d)
print('url     :', d.url)
print('fragment:', d.fragment)

結果爲:字符串

DefragResult(url='http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg', fragment='fragment')
url     : http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg
fragment: fragment

 

 

組建URL

組建url(urlunparse())

urlunparse()接收一個列表的參數,並且列表的長度是有要求的,是必須六個參數以上,不然拋出異常。get

from urllib.parse import urlunparse
url_compos = ('http', 'user:pwd@domain:80', '/path1;params1/path2', 'params2', 'query=queryarg', 'fragment')
print(urlunparse(url_compos))

結果爲:

http://user:pwd@domain:80/path1;params1/path2;params2?query=queryarg#fragment

 

 

組建url(urljoin())

urljoin()將兩個字符串拼接成url,

from urllib.parse import urljoin
# 鏈接兩個參數的url, 將第二個參數中缺的部分用第一個參數的補齊,若是第二個有完整的路徑,則以第二個爲主
print(urljoin('https://movie.douban.com/', 'index'))
print(urljoin('https://movie.douban.com/', 'https://accounts.douban.com/login'))

結果爲:

https://movie.douban.com/index
https://accounts.douban.com/login

 

 

查詢參數的構造與解析

 

使用 urlencode() 函數能夠將一個 dict 轉換成合法的查詢參數:

from urllib.parse import urlencode

query_args = {
    'name': 'dark sun',
    'country': '中國'
}

query_args = urlencode(query_args)
print(query_args)

結果爲:

name=dark+sun&country=%E4%B8%AD%E5%9B%BD

 

使用 parse_qs() 來將查詢參數解析成 dict。

from urllib.parse import urlencode
from urllib.parse import parse_qs
query_args = {
    'name': 'dark sun',
    'country': '中國'
}

query_args = urlencode(query_args)
print(query_args)
print(parse_qs(query_args))

結果爲:

name=dark+sun&country=%E4%B8%AD%E5%9B%BD
{'name': ['dark sun'], 'country': ['中國']}

 

quote()與unquote()

quoteI()對特殊字符進行轉義unquote()則相反。

from urllib.parse import quote
from urllib.parse import unquote
test1 = quote('中文')
print(test1)
test2 = unquote(test1)
print(test2)

結果爲:

%E4%B8%AD%E6%96%87
中文
相關文章
相關標籤/搜索