三大解析庫(kù)的使用

寫(xiě)在前面的話:我們前面學(xué)習(xí)了正則,但是正則是個(gè)很繁瑣的東西枣氧,一旦寫(xiě)錯(cuò)溢十,就要匹配失敗,我們還要不斷的調(diào)試达吞,對(duì)于一個(gè)網(wǎng)頁(yè)來(lái)說(shuō)都是具有一定的層次性张弛,有的有id,class名酪劫,我們可不可以通過(guò)這些來(lái)獲取我們想要的屬性或者文本吞鸭?下面可以看看怎么來(lái)獲取。

1覆糟,XPath的使用

在使用前刻剥,需要安裝lxml庫(kù)。

安裝代碼:pip3 install lxml

1.1XPath的常用規(guī)則:

/? 表示選取直接子節(jié)點(diǎn)

// 表示選取所有子孫節(jié)點(diǎn)

.? 選取當(dāng)前節(jié)點(diǎn)

.. 選取當(dāng)前結(jié)點(diǎn)的父節(jié)點(diǎn)

@? 選取屬性

看完這些滩字?你是不是還是一臉懵逼造虏?下面我們來(lái)實(shí)際運(yùn)用一下。

1.2實(shí)例引用

如圖:

導(dǎo)入etree模塊

etree.HTML()是構(gòu)造一個(gè)XPath對(duì)象

etree.tostring()是對(duì)代碼進(jìn)行修正麦箍,如果有缺失的部分漓藕,會(huì)自動(dòng)修復(fù)

方法比較簡(jiǎn)單,就不截取效果圖了挟裂。

如果我們相對(duì)本地的文件進(jìn)行解析怎么辦享钞?我們可以這樣寫(xiě)

etree.parse()第一個(gè)參數(shù)為html的路徑,第二(etree.HTMLParser())和上面etree.HTML()的性質(zhì)是一樣的诀蓉,為了方便栗竖,接下里我使用對(duì)本地文件進(jìn)行解析暑脆。

html文本如下:

1.3獲取所有的節(jié)點(diǎn)

結(jié)果:

開(kāi)頭用//表示選取所有符合的節(jié)點(diǎn),*表示獲取所有的節(jié)點(diǎn)狐肢,

上面兩句話一看這不是一個(gè)意思嗎添吗?會(huì)不懂!

我們可以分為兩步理解:

第一步//是選取所有符合要求的節(jié)點(diǎn)处坪,沒(méi)有指明是什么要求根资!,不知道你要獲取什么.

第二步*表示所有節(jié)點(diǎn)同窘,所以才會(huì)獲取所有節(jié)點(diǎn)玄帕。這樣理解起來(lái)應(yīng)該會(huì)很容易了吧。

注意:返回的是一個(gè)列表

1.4獲取指定的節(jié)點(diǎn)

還是上面的html文本想邦,如果我們想獲取li節(jié)點(diǎn)怎么辦裤纹?

只需要將result_text=html.xpath('//*')修改成result_text=html.xpath('//li')

如果想獲取a節(jié)點(diǎn),就修改成//a,也可以寫(xiě)成//li//a丧没,或者//ul//a獲取//li/a

都是可以獲取到但是如果//ul/a是獲取不到的因?yàn)?表示的是直接子節(jié)點(diǎn)

注意:返回的都是節(jié)點(diǎn)鹰椒,并不是文本信息。

即:

這種形式呕童。

1.4屬性匹配

如果我們想要a標(biāo)簽的href屬性漆际,我們可以修改成//a/@href

返回結(jié)果:

返回的也是一個(gè)列表

如果我們想要匹配class為li_1的li,可以修改成//li[@class="li_1"]即可

1.5父節(jié)點(diǎn)匹配

我們來(lái)獲取link2.html的a節(jié)點(diǎn)的父節(jié)點(diǎn)的class屬性夺饲,我們是需要修改成//a[@href="link2.html"]/../@class奸汇,這里的..表示尋找父節(jié)點(diǎn),返回的依然是一個(gè)列表往声。

1.6獲取文本

我們來(lái)獲取class為li_3的li下a的文本擂找,可以寫(xiě)成//li[@class="li_3"]/a/text()即可

1.7contains()函數(shù)

比如其中有一個(gè)li為:<li class="li li_last"? id="caidan"></li>

此時(shí):li具有兩個(gè)class名,我們?nèi)绻@樣寫(xiě)//li[@class="li"]是獲取不到節(jié)點(diǎn)的

那么我們可以這樣寫(xiě)獲取到節(jié)點(diǎn)//li[contains(@class,"li")]浩销。

1.8多屬性獲取

<li class="li? li_last" id="caidan"></li>贯涎,同樣是這個(gè)li我們需要獲取class名為li同時(shí)id為caidan的li,可以這樣寫(xiě)//li[contains(@class,"li") and @id="caidan"]

獲取class名為li或者id為caidan的li就用or慢洋。

1.9塘雳,last(),position()函數(shù)

上面的html有很多l(xiāng)i,如果我只想獲取第一個(gè)可以這樣:

//li[1],同理第二個(gè)改成2就可以了普筹,如果想獲取最后一個(gè)://li[last()]

如果想獲取前兩個(gè)://li[position()<3]

2,Beautiful Soup的使用

同樣的在使用前我們也要安裝Beautiful Soup

沒(méi)有安裝的請(qǐng)自行安裝粉捻。

首先導(dǎo)入模塊:from bs4 import BeautifulSoup

這次我們直接用一個(gè)網(wǎng)站來(lái)試試,我選擇的是貓眼網(wǎng)斑芜,

你可以選擇其他網(wǎng)站哦。

獲取網(wǎng)頁(yè)部分祟霍,上節(jié)有教杏头,鏈接:python第二大神器requests

如圖:

2.1初始化

BeautifulSoup()第一個(gè)參數(shù)為獲取的網(wǎng)頁(yè)內(nèi)容盈包,第二個(gè)參數(shù)為lxml,為什么是lxml醇王?因?yàn)锽eautiful Soup在解析時(shí)依賴解析器呢燥,python自帶的解析器,容錯(cuò)能力差寓娩,比較慢叛氨,所以我們使用第三方解析器lxml,

prettify()是將獲取的內(nèi)容以縮進(jìn)的方式輸出棘伴,看起來(lái)很舒服

如圖:

看起來(lái)舒服多了寞埠。

2.2獲取值

我們來(lái)獲取一下title信息,我們是需要這樣焊夸。

結(jié)果:

我們可以看到title獲取的是title節(jié)點(diǎn)的所有信息仁连,而加個(gè)string就變成了title里的文本內(nèi)容,這樣是不是也是很簡(jiǎn)單阱穗?

2.21獲取屬性值

比如饭冬,我們想要獲取img的src屬性,我們只需要揪阶,soup.img['src']就可以獲取到昌抠,soup.img.arrts['src']也可以獲取到。

如果想獲取到所有的屬性就這樣寫(xiě):soup.img.arrts即可

如圖所示:

注意:所有的屬性返回的形式是以字典的形式返回鲁僚。

2.3獲取直接子節(jié)點(diǎn)和子孫節(jié)點(diǎn)炊苫,父節(jié)點(diǎn),祖先節(jié)點(diǎn)蕴茴,兄弟節(jié)點(diǎn)

獲取直接子節(jié)點(diǎn):contents劝评,例如我想獲取p標(biāo)簽的直接子節(jié)點(diǎn):soup.p.contents即可

獲取子孫節(jié)點(diǎn):descendants,例如我想獲取p標(biāo)簽的子孫節(jié)點(diǎn):soup.p.descendants即可

獲取父節(jié)點(diǎn):parent屬性,例如我想獲取p標(biāo)簽的父節(jié)點(diǎn):soup.p.parent即可

獲取祖先節(jié)點(diǎn):parents屬性倦淀,例如我想獲取p標(biāo)簽的祖先節(jié)點(diǎn):soup.p.parents即可

獲取兄弟節(jié)點(diǎn):next_sibling,previous_sibling,next_siblings,previous_siblings分別為下一個(gè)兄弟節(jié)點(diǎn)蒋畜,上一個(gè)兄弟節(jié)點(diǎn),上面所有的兄弟節(jié)點(diǎn)撞叽,下面所有的兄弟節(jié)點(diǎn)姻成。

2.4獲取文本屬性

string為獲取文本

attrs為獲取屬性

2.5方法選擇器

find_all()返回的一個(gè)列表,匹配所有符合要求的元素

如果我們想要獲取ul可以這樣寫(xiě):soup.find_all(name='ul')

如果我們想要獲取id為id1屬性可以這樣寫(xiě):soup.find_all(arrts[id='id1'])

如果我們想要獲取class為class1屬性可以這樣寫(xiě):soup.find_all(arrts[class_='class1'])

因?yàn)閏lass有特殊意義愿棋,所以我們獲取class的時(shí)候價(jià)格_即可

如果我們想要獲取文本值可以這樣寫(xiě):soup.find_all(text=re.compile(''))

匹配text需要用到正則科展,匹配你想要的text值

find()只返回一個(gè)值,匹配到符合要求的第一個(gè)值糠雨。

用法和上面的方法一樣

注意:以上說(shuō)有的屬性才睹,方法都是通過(guò)我實(shí)例的soup來(lái)調(diào)用,soup是我的命名,你可以修改它琅攘,同時(shí)你調(diào)用就要用你的命名了

2.6css選擇器

我們?nèi)绻胏ss選擇器需要調(diào)用select()方法

比如想獲取class名為class1的節(jié)點(diǎn)垮庐,我們可以這樣寫(xiě):soup.select('.class1')即可,和css的表達(dá)方式是一樣的坞琴,但是他的css選擇器功能不夠強(qiáng)大哨查,下面我們介紹一個(gè)針對(duì)css的解析庫(kù)。

3剧辐,pyquery的使用

首先要安裝pyquery

沒(méi)有安裝的請(qǐng)自行安裝寒亥。

導(dǎo)入模塊:from pyquery import PyQuery

首先和上面的一樣,同樣需要初始化荧关,獲取對(duì)象

如下:

結(jié)果:

這樣就獲取到了所有的li

此外:初始化對(duì)象時(shí)溉奕,可以填寫(xiě)文本(上面就是),還可以填寫(xiě)url:PyQuery(url='https://maoyan.com/')

還可以填寫(xiě)本地文件:PyQuery(filename=''),''中填寫(xiě)本地文件的路徑

3.1css選擇器的基本用法

如果想選取class名為class1下的li可以這樣寫(xiě)result('.class li')和css的選擇器寫(xiě)法是一樣的羞酗。

3.2find()方法腐宋,子節(jié)點(diǎn),父節(jié)點(diǎn)檀轨,兄弟節(jié)點(diǎn)

和上面不同這里的find()方法是查找所有的子孫節(jié)點(diǎn)胸竞,

如果想獲取li下的所有a節(jié)點(diǎn)可以這樣寫(xiě):result('li').find('a')即可

如果只想查找子節(jié)點(diǎn):children()方法即可

父節(jié)點(diǎn):parent()獲取直接父節(jié)點(diǎn)

獲取所有父節(jié)點(diǎn):parents()獲取所有父節(jié)點(diǎn),如果只想要父節(jié)節(jié)點(diǎn)中class為class1的可以這樣寫(xiě):parents('.class1')

注意:輸出的是父節(jié)點(diǎn)的所有內(nèi)容参萄。

兄弟節(jié)點(diǎn):siblis()方法卫枝,如果只想要兄弟節(jié)點(diǎn)中id為id1的可以這樣寫(xiě):parents('#id1')

3.3對(duì)于獲取的結(jié)果,不想上面返回的是列表讹挎,這里如果返回多個(gè)對(duì)象需要for循環(huán)遍歷

3.4獲取屬性校赤,文本,

例如我們想要獲取li下a的href屬性(attr()函數(shù))筒溃,由于有多個(gè)結(jié)果马篮,所以我們這里需要遍歷。

如圖:

結(jié)果:

注意:如果不遍歷怜奖,只會(huì)輸出第一個(gè)

如果我們想要獲取文本值:text()方法浑测,只需要將attr()函數(shù)改為text()函數(shù)即可

3.6對(duì)屬性,文本歪玲,class的刪除迁央,修改

addClass('class1'):表示添加一個(gè)class名,名字為class1

removeClass('class1')表示刪除一個(gè)class名滥崩,名字為class1

我們來(lái)實(shí)例一下:

結(jié)果:

同時(shí)我們還可以添加屬性岖圈,文本

添加屬性:attr('name','name1')

添加文本:text('123123')

添加代碼:html('12122')

有了添加,就有刪除remove()函數(shù)

比如如果我們想刪除li下的所有a節(jié)點(diǎn)

可以這樣寫(xiě):result('li').find('a').remove()

4.0完

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末钙皮,一起剝皮案震驚了整個(gè)濱河市蜂科,隨后出現(xiàn)的幾起案子顽决,更是在濱河造成了極大的恐慌,老刑警劉巖崇摄,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件擎值,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡逐抑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)屹蚊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厕氨,“玉大人,你說(shuō)我怎么就攤上這事汹粤∶” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵嘱兼,是天一觀的道長(zhǎng)国葬。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芹壕,這世上最難降的妖魔是什么汇四? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮踢涌,結(jié)果婚禮上通孽,老公的妹妹穿的比我還像新娘。我一直安慰自己睁壁,他們只是感情好背苦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著潘明,像睡著了一般行剂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钳降,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天厚宰,我揣著相機(jī)與錄音,去河邊找鬼牲阁。 笑死固阁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的城菊。 我是一名探鬼主播备燃,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凌唬!你這毒婦竟也來(lái)了并齐?” 一聲冷哼從身側(cè)響起漏麦,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎况褪,沒(méi)想到半個(gè)月后撕贞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡测垛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年捏膨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片食侮。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡号涯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锯七,到底是詐尸還是另有隱情导而,我是刑警寧澤舷手,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布戒职,位于F島的核電站缘屹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏噪猾。R本人自食惡果不足惜霉祸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畏妖。 院中可真熱鬧脉执,春花似錦、人聲如沸戒劫。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迅细。三九已至巫橄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茵典,已是汗流浹背湘换。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留统阿,地道東北人彩倚。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像扶平,于是被迫代替她去往敵國(guó)和親帆离。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容