中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3爬蟲中如何解析鏈接

發布時間:2020-08-05 14:02:56 來源:億速云 閱讀:407 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Python3爬蟲中如何解析鏈接的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

前面說過,urllib庫里還提供了parse這個模塊,它定義了處理URL的標準接口,例如實現URL各部分的抽取、合并以及鏈接轉換。它支持如下協議的URL處理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、 sip、sips、snews、svn、svn+ssh、telnet和wais。本節中,我們介紹一下該模塊中常用的方法來看一下它的便捷之處。

1. urlparse()

該方法可以實現URL的識別和分段,這里先用一個實例來看一下:

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result)

這里我們利用urlparse()方法進行了一個URL的解析。首先,輸出了解析結果的類型,然后將結果也輸出出來。

運行結果如下:

<class 'urllib.parse.ParseResult'>
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', 
fragment='comment')

可以看到,返回結果是一個ParseResult類型的對象,它包含6部分,分別是scheme、netloc、path、params、query和fragment。

觀察一下該實例的URL:

http://www.baidu.com/index.html;user?id=5#comment

可以發現,urlparse()方法將其拆分成了6部分。大體觀察可以發現,解析時有特定的分隔符。比如,://前面的就是scheme,代表協議;第一個/前面便是netloc,即域名;分號;前面是params,代表參數。

所以,可以得出一個標準的鏈接格式,具體如下:

scheme://netloc/path;parameters?query#fragment

一個標準的URL都會符合這個規則,利用urlparse()方法可以將它拆分開來。

除了這種最基本的解析方式外,urlparse()方法還有其他配置嗎?接下來,看一下它的API用法:

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

可以看到,它有3個參數。

urlstring:這是必填項,即待解析的URL。

scheme:它是默認的協議(比如http或https等)。假如這個鏈接沒有帶協議信息,會將這個作為默認的協議。我們用實例來看一下:

from urllib.parse import urlparse
result = urlparse('www.baidu.com/index.html;user?id=5#comment', scheme='https')
print(result)

運行結果如下:

ParseResult(scheme='https', netloc='', path='www.baidu.com/index.html', params='user', query='id=5', 
fragment='comment')

可以發現,我們提供的URL沒有包含最前面的scheme信息,但是通過指定默認的scheme參數,返回的結果是https。

假設我們帶上了scheme:

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

則結果如下:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5', fragment='comment')

可見,scheme參數只有在URL中不包含scheme信息時才生效。如果URL中有scheme信息,就會返回解析出的scheme。

allow_fragments:即是否忽略fragment。如果它被設置為False,fragment部分就會被忽略,它會被解析為path、parameters或者query的一部分,而fragment部分為空。下面我們用實例來看一下:

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment', allow_fragments=False)
print(result)

運行結果如下:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html', params='user', query='id=5#comment', 
fragment='')

假設URL中不包含params和query,我們再通過實例看一下:

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html#comment', allow_fragments=False)
print(result)

運行結果如下:

ParseResult(scheme='http', netloc='www.baidu.com', path='/index.html#comment', params='', query='', fragment='')

可以發現,當URL中不包含params和query時,fragment便會被解析為path的一部分。

返回結果ParseResult實際上是一個元組,我們可以用索引順序來獲取,也可以用屬性名獲取。示例如下:

from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html#comment', allow_fragments=False)
print(result.scheme, result[0], result.netloc, result[1], sep='\n')

這里我們分別用索引和屬性名獲取了scheme和netloc,其運行結果如下:

http
http
www.baidu.com
www.baidu.com

可以發現,二者的結果是一致的,兩種方法都可以成功獲取。

2. urlunparse()

有了urlparse(),相應地就有了它的對立方法urlunparse()。它接受的參數是一個可迭代對象,但是它的長度必須是6,否則會拋出參數數量不足或者過多的問題。先用一個實例看一下:

from urllib.parse import urlunparse
data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
print(urlunparse(data))

這里參數data用了列表類型。當然,你也可以用其他類型,比如元組或者特定的數據結構。

運行結果如下:

http://www.baidu.com/index.html;user?a=6#comment

這樣我們就成功實現了URL的構造。

3. urlsplit()

這個方法和urlparse()方法非常相似,只不過它不再單獨解析params這一部分,只返回5個結果。上面例子中的params會合并到path中。示例如下:

from urllib.parse import urlsplit
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')

可以發現,返回結果是SplitResult,它其實也是一個元組類型,既可以用屬性獲取值,也可以用索引來獲取。示例如下:

from urllib.parse import urlsplit
 
result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result.scheme, result[0])

運行結果如下:

http http

4. urlunsplit()

與urlunparse()類似,它也是將鏈接各個部分組合成完整鏈接的方法,傳入的參數也是一個可迭代對象,例如列表、元組等,唯一的區別是長度必須為5。示例如下:

from urllib.parse import urlunsplit
data = ['http', 'www.baidu.com', 'index.html', 'a=6', 'comment']
print(urlunsplit(data))

運行結果如下:

http://www.baidu.com/index.html?a=6#comment

5. urljoin()

有了urlunparse()和urlunsplit()方法,我們可以完成鏈接的合并,不過前提必須要有特定長度的對象,鏈接的每一部分都要清晰分開。

此外,生成鏈接還有另一個方法,那就是urljoin()方法。我們可以提供一個base_url(基礎鏈接)作為第一個參數,將新的鏈接作為第二個參數,該方法會分析base_url的scheme、netloc和path這3個內容并對新鏈接缺失的部分進行補充,最后返回結果。

下面通過幾個實例看一下:

from urllib.parse import urljoin
print(urljoin('http://www.baidu.com', 'FAQ.html'))
print(urljoin('http://www.baidu.com', 'https://cuiqingcai.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://cuiqingcai.com/FAQ.html?question=2'))
print(urljoin('http://www.baidu.com?wd=abc', 'https://cuiqingcai.com/index.php'))
print(urljoin('http://www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com#comment', '?category=2'))

運行結果如下:

http://www.baidu.com/FAQ.html
https://cuiqingcai.com/FAQ.html
https://cuiqingcai.com/FAQ.html
https://cuiqingcai.com/FAQ.html?question=2
https://cuiqingcai.com/index.php
http://www.baidu.com?category=2#comment
www.baidu.com?category=2#comment
www.baidu.com?category=2

可以發現,base_url提供了三項內容scheme、netloc和path。如果這3項在新的鏈接里不存在,就予以補充;如果新的鏈接存在,就使用新的鏈接的部分。而base_url中的params、query和fragment是不起作用的。

通過urljoin()方法,我們可以輕松實現鏈接的解析、拼合與生成。

6. urlencode()

這里我們再介紹一個常用的方法——urlencode(),它在構造GET請求參數的時候非常有用,示例如下:

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

這里首先聲明了一個字典來將參數表示出來,然后調用urlencode()方法將其序列化為GET請求參數。

運行結果如下:

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

可以看到,參數就成功地由字典類型轉化為GET請求參數了。

這個方法非常常用。有時為了更加方便地構造參數,我們會事先用字典來表示。要轉化為URL的參數時,只需要調用該方法即可。

7. parse_qs()

有了序列化,必然就有反序列化。如果我們有一串GET請求參數,利用parse_qs()方法,就可以將它轉回字典,示例如下:

from urllib.parse import parse_qs
query = 'name=germey&age=22'
print(parse_qs(query))

運行結果如下:

{'name': ['germey'], 'age': ['22']}

可以看到,這樣就成功轉回為字典類型了。

8. parse_qsl()

另外,還有一個parse_qsl()方法,它用于將參數轉化為元組組成的列表,示例如下:

from urllib.parse import parse_qsl
query = 'name=germey&age=22'
print(parse_qsl(query))

運行結果如下:

[('name', 'germey'), ('age', '22')]

可以看到,運行結果是一個列表,而列表中的每一個元素都是一個元組,元組的第一個內容是參數名,第二個內容是參數值。

9. quote()

該方法可以將內容轉化為URL編碼的格式。URL中帶有中文參數時,有時可能會導致亂碼的問題,此時用這個方法可以將中文字符轉化為URL編碼,示例如下:

from urllib.parse import quote
keyword = '壁紙'
url = 'https://www.baidu.com/s?wd=' + quote(keyword)
print(url)

這里我們聲明了一個中文的搜索文字,然后用quote()方法對其進行URL編碼,最后得到的結果如下:

https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8

10. unquote()

有了quote()方法,當然還有unquote()方法,它可以進行URL解碼,示例如下:

from urllib.parse import unquote
url = 'https://www.baidu.com/s?wd=%E5%A3%81%E7%BA%B8'
print(unquote(url))

這是上面得到的URL編碼后的結果,這里利用unquote()方法還原,結果如下:

https://www.baidu.com/s?wd=壁紙

可以看到,利用unquote()方法可以方便地實現解碼。

感謝各位的閱讀!關于Python3爬蟲中如何解析鏈接就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂尔多斯市| 吉木萨尔县| 家居| 卓尼县| 绥化市| 天长市| 永昌县| 交口县| 黑龙江省| 应城市| 辉南县| 大连市| 灵寿县| 宁夏| 保德县| 张家川| 乡宁县| 黔东| 新昌县| 汉中市| 西乌珠穆沁旗| 抚顺县| 屯昌县| 威宁| 大港区| 庐江县| 南川市| 吴堡县| 加查县| 马龙县| 永仁县| 浑源县| 洮南市| 奉化市| 新沂市| 宝应县| 唐山市| 天峻县| 平江县| 饶阳县| 仁怀市|