requests-html快速入門

Python上有一個非常著名的HTTP庫——requests,相比大家都聽說過,用過的人都說好!現在requests庫的作者又發佈了一個新庫,叫做requests-html,看名字也能猜出來,這是一個解析HTML的庫,而且用起來和requests一樣爽,下面就來介紹一下它。

安裝
安裝requests-html非常簡單,一行命令即可做到。需要注意一點就是,requests-html只支持Python 3.6及更新的版本,所以使用老版本的Python的同學需要更新一下Python版本了。看了下源代碼,因爲requests-html廣泛使用了一個Python 3.6中的新特性——類型註解。

pip install requests-html

基本使用
獲取網頁
requests-html和其他解析HTML庫最大的不同點在於HTML解析庫一般都是專用的,所以我們需要用另一個HTTP庫先把網頁下載下來,然後傳給那些HTML解析庫。而requests-html自帶了這個功能,所以在爬取網頁等方面非常方便。

下面的代碼獲取了糗事百科上面的文字段子頁面,返回的對象r是requests.Reponse類型,更確切的說是繼承自前者的requests_html.HTMLResponse類型。這裏其實和requests庫的使用方法差不多,獲取到的響應對象其實其實也沒啥用,這裏的關鍵就在於r.html這個屬性,它會返回requests_html.HTML這個類型,它是整個requests_html庫中最核心的一個類,負責對HTML進行解析。我們學習requests_html這個庫,其實也就是學習這個HTML類的使用方法。

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://www.qiushibaike.com/text/')
// 查看頁面內容
print(r.html.html)

獲取鏈接
links和absolute_links兩個屬性分別返回HTML對象所包含的所有鏈接和絕對鏈接(均不包含錨點)。

# 獲取鏈接
print(r.html.links)
print(r.html.absolute_links)

結果爲下(因爲結果太長,所以我隨便取了一點,看個意思就行):

{'/article/104353012', '/article/120616112', '/users/32331196/'}
{'https://www.qiushibaike.com/imgrank/', 'https://www.qiushibaike.com/article/120669516', 'https://www.qiushibaike.com/article/120682041'}

獲取元素
request-html支持CSS選擇器和XPATH兩種語法來選取HTML元素。首先先來看看CSS選擇器語法,它需要使用HTML的find函數,該函數有5個參數,作用如下: 
- selector,要用的CSS選擇器; 
- clean,布爾值,如果爲真會忽略HTML中style和script標籤造成的影響(原文是sanitize,大概這麼理解); 
- containing,如果設置該屬性,會返回包含該屬性文本的標籤; 
- first,布爾值,如果爲真會返回第一個元素,否則會返回滿足條件的元素列表; 
- _encoding,編碼格式。

下面是幾個簡單例子:

# 首頁菜單文本
print(r.html.find('div#menu', first=True).text)
# 首頁菜單元素
print(r.html.find('div#menu a'))
# 段子內容
print(list(map(lambda x: x.text, r.html.find('div.content span'))))

結果如下,因爲段子太多,所以隨便選了兩個:

熱門 24小時 熱圖 文字 穿越 糗圖 新鮮
[<Element 'a' href='/' rel=('nofollow',)>, <Element 'a' href='/hot/'>, <Element 'a' href='/imgrank/'>, <Element 'a' id='highlight' href='/text/'>, <Element 'a' href='/history/'>, <Element 'a' href='/pic/'>, <Element 'a' href='/textnew/'>]
['有一次,幾位大城市的朋友來家裏玩,我招待他們吃風乾羊肉做臊子的餄餎面,這是我們老家最具特色的美食!飯快熟的時候,老婆讓我在園子裏摘點“芫荽 ”,朋友問我,“芫荽”是什麼東東?我給他們翻譯解釋說:我們本地土話叫“芫荽”,你們城裏人講普通話叫香菜,他們還大笑了一場。\n前天下雨沒事兒幹,翻看新華字典,突然發現“芫荽”纔是香菜的學名,Tm香菜纔是土話!而且我們地方方言就這兩個字發音還特別標準!', '昨天晚上跟老婆吵架,他抓起我的手機就摔了。我立馬摔了他的,結果我的還能用,他的壞了。高潮是人家立刻出門買了個新的!我艹,是不是中計了??', '小姨要去高鐵站,我看着大大小小的箱子說:坐公交車要轉車,轉來轉去要一個多小時,太不方便了,不如我開車送你吧。\n小姨遲疑了一下,同意了。\n我準時把小姨送到了高鐵站,正好趕上檢票。\n小姨高興地說:自己開車就是方便,不過幸好你媽聰明,讓我們提前兩個多小時就出發了!'

然後是XPATH語法,這需要另一個函數xpath的支持,它有4個參數如下: 
- selector,要用的XPATH選擇器; 
- clean,布爾值,如果爲真會忽略HTML中style和script標籤造成的影響(原文是sanitize,大概這麼理解); 
- first,布爾值,如果爲真會返回第一個元素,否則會返回滿足條件的元素列表; 
- _encoding,編碼格式。

還是上面的例子,不過這次使用XPATH語法:

print(r.html.xpath("//div[@id='menu']", first=True).text)
print(r.html.xpath("//div[@id='menu']/a"))
print(r.html.xpath("//div[@class='content']/span/text()"))

輸出和上面那個幾乎一樣,之所以說是“幾乎”,因爲第三個輸出會多出幾個換行符,不知道什麼原因。需要注意的一點是如果XPATH中包含text()或@href這樣的子屬性,那麼結果相應的會變成簡單的字符串類型,而不是HTML元素。

['\n\n\n我一份文件忘家裏了,又懶得回家取,就給小姨子發短信息:   幫我把文件送來,晚上我謝謝你。等半天也沒送來文件,我只好打個車回家自己拿,到家一進屋,我就發現氣氛不對勁,老婆鐵青着臉,兩手掐着腰,小姨子站旁邊對我怒目而視。']

元素內容
糗事百科首頁LOGO的HTML代碼如下所示:

<div class="logo" id="hd_logo">
<a href="/"><h1>糗事百科</h1></a>
</div>

我們來選取這個元素:

e = r.html.find("div#hd_logo", first=True)

要獲取元素的文本內容,用text屬性:

print(e.text)
# 糗事百科

要獲取元素的attribute,用attr屬性:

print(e.attrs)
# {'class': ('logo',), 'id': 'hd_logo'}

要獲取元素的HTML代碼,用html屬性:

print(e.html)
# <div class="logo" id="hd_logo">
# <a href="/"><h1>糗事百科</h1></a>
# </div>

要搜索元素的文本內容,用search函數,比如說我們現在想知道是糗事什麼科:

print(e.search("糗事{}科")[0])
# 百

最後還有前面提到的兩個鏈接屬性:

print(e.absolute_links)
print(e.links)
# {'https://www.qiushibaike.com/'}
# {'/'}

點擊原文鏈接 閱讀完整內容

--------------------- 
作者:過了即是客 
原文:https://blog.csdn.net/u011054333/article/details/81055423

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章