Python網(wǎng)絡(luò)爬蟲 課件 項(xiàng)目6:解析網(wǎng)頁_第1頁
Python網(wǎng)絡(luò)爬蟲 課件 項(xiàng)目6:解析網(wǎng)頁_第2頁
Python網(wǎng)絡(luò)爬蟲 課件 項(xiàng)目6:解析網(wǎng)頁_第3頁
Python網(wǎng)絡(luò)爬蟲 課件 項(xiàng)目6:解析網(wǎng)頁_第4頁
Python網(wǎng)絡(luò)爬蟲 課件 項(xiàng)目6:解析網(wǎng)頁_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

項(xiàng)目六

解析網(wǎng)頁任務(wù)1正則表達(dá)式解析網(wǎng)頁任務(wù)2XPath解析網(wǎng)頁任務(wù)3BeautifulSoup解析網(wǎng)頁任務(wù)1正則表達(dá)式解析網(wǎng)頁任務(wù)引入發(fā)去網(wǎng)絡(luò)請(qǐng)求獲取響應(yīng)后,面對(duì)返回的響應(yīng)數(shù)據(jù),也就是一堆代碼,小白根本無從下手。面對(duì)這一堆天文數(shù)據(jù),小白一度想要放棄。保爾·柯察金說過,人的一生應(yīng)該這樣度過——當(dāng)他回首往事時(shí)不因虛度年華而悔恨,也不因碌碌無為而羞恥。小白收拾心情,重新整理問題。在學(xué)習(xí)群里向不同的學(xué)長發(fā)出疑問,大家給出一堆意見,小白還是無從下手。思前想后,小白決定從最簡單的re模塊開始學(xué)習(xí)。那么,Python中的re模塊有什么用途?re模塊如何實(shí)現(xiàn)網(wǎng)頁解析?知識(shí)準(zhǔn)備爬蟲獲取的網(wǎng)頁內(nèi)容html本質(zhì)是字符串,處理字符串最基本的方法是通過相關(guān)的字符串函數(shù),但效率很低,容易出錯(cuò)。除此之外,還可以使用正則表達(dá)式處理字符串。正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對(duì)字符串的一種過濾邏輯。正則表達(dá)式(RegularExpression)是用于描述一組字符串特征的模式,用來驗(yàn)證特定的字符串。通過特殊字符+普通字符來進(jìn)行模式描述,從而達(dá)到文本驗(yàn)證目的工具。正則表達(dá)式目前被集成到了各種文本編輯器/文本處理工具當(dāng)中,正則表達(dá)式字符串的處理方法包括查找、替換、分割。一、正則表達(dá)式模式正則表達(dá)式描述了一種字符串驗(yàn)證的模式(pattern),可以用來檢查一個(gè)串是否含有某種子串、將驗(yàn)證的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。下面介紹幾種常用模式:runoo+b:可以驗(yàn)證runoob、runooob、runoooooob等,+號(hào)代表前面的字符必須至少出現(xiàn)一次(1次或多次)。runoo*b:可以驗(yàn)證runob、runoob、runoooooob等,*號(hào)代表前面的字符可以不出現(xiàn),也可以出現(xiàn)一次或者多次(0次、或1次、或多次)。colou?r:可以驗(yàn)證color或者colour,?問號(hào)代表前面的字符最多只可以出現(xiàn)一次(0次、或1次)。1.普通字符普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符。這包括所有大寫和小寫字母、所有數(shù)字、所有標(biāo)點(diǎn)符號(hào)和一些其他符號(hào)。2.特殊字符所謂特殊字符,就是一些有特殊含義的字符,如runoo*b中的*,簡單的說就是表示任何字符串。如果要查找字符串中的*符號(hào),則需要對(duì)*進(jìn)行轉(zhuǎn)義,即在其前加一個(gè)\,runo\*ob驗(yàn)證字符串runo*ob。許多元字符要求在試圖驗(yàn)證它們時(shí)特別對(duì)待。若要驗(yàn)證這些特殊字符,必須首先使字符"轉(zhuǎn)義",即將反斜杠字符\

放在前面。表列出了正則表達(dá)式中的特殊字符:3.限定符包括

*

+

?

{n}

{n,}

{n,m}共6種,具體含義見表。4.創(chuàng)建模式字符串模式是正則表達(dá)式最基本的元素,它們是一組描述字符串特征的字符。二、使用re模塊實(shí)現(xiàn)正則表達(dá)式當(dāng)前絕大多數(shù)網(wǎng)頁源代碼都是用HTML語言編寫的,而HTML語言時(shí)非常有規(guī)律性的,比如所有文章標(biāo)題都具有相同結(jié)構(gòu),也就是說它周圍的字符串都是非常類似的,這樣才能批量獲取。Python提供了re模塊,用于實(shí)現(xiàn)正則表達(dá)式的操作。步驟如下:使用re模塊compile方法將模式字符串轉(zhuǎn)換為Pattern對(duì)象使用該對(duì)象提供的方法進(jìn)行字符串處理,也可以直接使用re模塊提供的方法進(jìn)行字符串處理。獲得驗(yàn)證結(jié)果,驗(yàn)證結(jié)果為一個(gè)Match(驗(yàn)證)對(duì)象三、字符串查找使用re模塊提供的match()、seardh()、findall()和finditer0等函數(shù)查找字符串。1.使用match進(jìn)行查找match函數(shù)用于從字符串的開始處進(jìn)行查找可選標(biāo)志符號(hào)案例——字符查找演示案例——字符查找對(duì)象演示案例——字符大小寫查找演示2.使用search進(jìn)行查找search函數(shù)用于從整個(gè)字符串進(jìn)行查找,如果在開始位置查找成功,則返回Match對(duì)象,否則返回None。案例——區(qū)分大小寫字符查找3.使用findall進(jìn)行查找findall函數(shù)用于在字符串中找到正則表達(dá)式所查找的所有子串,并返回一個(gè)列表,如果有多個(gè)查找模式,則返回元組列表,如果沒有找到查找的,則返回空列表。案例——網(wǎng)址中查找數(shù)字4.使用finditer進(jìn)行查找findite函數(shù)用于在字符串中找到正則表達(dá)式所查找的所有子串,并把它們作為一個(gè)迭代器返回。案例——輸出數(shù)字查找結(jié)果表達(dá)式四、字符串替換Python利用sub函數(shù)將指定格式的文本進(jìn)行正則驗(yàn)證查找,找到之后進(jìn)行特定替換案例——HTTP協(xié)議替換演示五、字符串分割split函數(shù)根據(jù)查找的子串將字符串分割后返回列表案例——字符分割演示任務(wù)2XPath解析網(wǎng)頁任務(wù)引入小白在搜索學(xué)習(xí)資料時(shí),突然注意到瀏覽器地址欄中的URL中有一個(gè)問號(hào)“?”,里面還包含自己搜索的關(guān)鍵字,這個(gè)網(wǎng)址是什么意思呢?在他的印象中,網(wǎng)頁好像大多是以.htm或.html結(jié)尾的。他好奇地打開瀏覽器的開發(fā)者工具,看到了許多包含在“<>”中的元素,他看到的網(wǎng)頁正是這些元素呈現(xiàn)出來的。那么他搜索關(guān)鍵字,對(duì)應(yīng)的網(wǎng)頁究竟是怎樣生成的呢?網(wǎng)頁中的那些標(biāo)記又分別代表什么呢?知識(shí)準(zhǔn)備XPath的選擇功能十分強(qiáng)大,它提供了非常簡潔明了的路徑選擇表達(dá)式。XPath相對(duì)于正則表達(dá)式顯得更加簡潔明了。一、

XPath概述XPath是一門在XML文檔中查找信息的語言,用于在XML文檔中通過元素和屬性進(jìn)行導(dǎo)航。XPath含有超過100個(gè)內(nèi)建的函數(shù),這些函數(shù)用于字符串值、數(shù)值、日期和時(shí)間比較、節(jié)點(diǎn)和QName處理、序列處理、邏輯值等等。1.XML文檔XML是由萬維網(wǎng)聯(lián)盟(W3C)創(chuàng)建的標(biāo)記語言,用于定義編碼人類和機(jī)器可以讀取的文檔的語法。圖顯示xml中節(jié)點(diǎn)樹的一個(gè)部分,并說明了節(jié)點(diǎn)之間的關(guān)系。2.lxml庫lxml庫是一個(gè)XML、HTML的解析器,主要用于解析和提取XML、HTML數(shù)據(jù)。二、xpath網(wǎng)頁解析xpath網(wǎng)頁解析步驟如下:(1)導(dǎo)入lxml庫的etree模塊,(2)使用實(shí)例化一個(gè)etree類的的對(duì)象(3)將源碼數(shù)據(jù)加載到etree的對(duì)象(4)輸出修正HTML文本調(diào)用etree.tostring方法輸出修正后的bytes類型HTML文本,使用decode方法將bytes類型的HTML文本轉(zhuǎn)成str類型。案例——解析文件中的代碼發(fā)送HTTP請(qǐng)求,訪問石家莊三維書屋公司網(wǎng)站首頁,下載HTML文件,利用parse函數(shù)解析網(wǎng)頁源代碼。運(yùn)行結(jié)果如下所示(篇幅限制,顯示部分源代碼):通過上面的結(jié)果,顯示解析后的html源代碼,解析前html文本如圖所示。案例——解析自定義代碼發(fā)送HTTP請(qǐng)求,訪問公司網(wǎng)站首頁,從網(wǎng)頁的源代碼中抽取一段,如圖所示,利用HTML函數(shù)解析網(wǎng)頁。三、獲取節(jié)點(diǎn)信息xpath方法通過路徑來選取XML文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集

Xpath常用的路徑表達(dá)式案例——獲取HTML文本所有節(jié)點(diǎn)信息圖中顯示爬取圖書網(wǎng)址中的一段HTML文本,通過Xpath中的路徑表達(dá)式//*獲取所有節(jié)點(diǎn),輸出相應(yīng)的節(jié)點(diǎn)信息。

通過上面的程序得到修正后的HTML文本,紅色圖框中顯示的是所有的節(jié)點(diǎn)名稱,如圖所示。案例——通過節(jié)點(diǎn)名稱獲取HTML文本節(jié)點(diǎn)Xpath可以通過節(jié)點(diǎn)路徑與節(jié)點(diǎn)名稱定位到指定節(jié)點(diǎn),輸出相應(yīng)的節(jié)點(diǎn)信息。案例——使用不同表達(dá)式獲取HTML文本節(jié)點(diǎn)通過Xpath中的\\和\表達(dá)式指定路徑,定位到指定節(jié)點(diǎn),輸出相應(yīng)的節(jié)點(diǎn)信息。四、節(jié)點(diǎn)關(guān)系根據(jù)XML文檔的嵌套關(guān)系按照親屬關(guān)系定義XML文檔的節(jié)點(diǎn)關(guān)系,如圖所示。父(Parent):nodename元素是title、author、year以及price元素的父。子(Children):title、author、year以及price元素都是nodename元素的子同胞(Sibling):title、author、year以及price元素都是同胞祖先(Ancestor):title元素的先輩是nodename元素和node元素后代(Descendant):node的后代是book、title、author、year以及price元素表列出了關(guān)于節(jié)點(diǎn)關(guān)系的路徑表達(dá)式。案例——獲取HTML文本節(jié)點(diǎn)關(guān)系圖通過Xpath中的路徑表達(dá)式輸出指定節(jié)點(diǎn)的父子節(jié)點(diǎn)。

節(jié)點(diǎn)關(guān)系圖五、查找節(jié)點(diǎn)信息謂語可以用來查找某個(gè)特定的節(jié)點(diǎn)或者包含某個(gè)指定的值的節(jié)點(diǎn),謂語被嵌在方括號(hào)中。在表中,列出了帶有謂語的一些路徑表達(dá)式及表達(dá)式的說明。案例——獲取HTML子節(jié)點(diǎn)信息通過Xpath中的路徑表達(dá)式輸出指定節(jié)點(diǎn)的子節(jié)點(diǎn)。六、屬性節(jié)點(diǎn)XPath共有七種類型的節(jié)點(diǎn):元素、屬性、文本、命名空間、處理指令、注釋以及根節(jié)點(diǎn)。整個(gè)文檔是一個(gè)根節(jié)點(diǎn);每個(gè)XML標(biāo)簽是一個(gè)元素節(jié)點(diǎn);包含在XML元素中的文本是文本節(jié)點(diǎn);每一個(gè)XML屬性是一個(gè)屬性節(jié)點(diǎn);注釋則屬于注釋節(jié)點(diǎn)。在XPath中,路徑表達(dá)式可以實(shí)現(xiàn)通過屬性定位節(jié)點(diǎn)的功能,具體見表。案例——獲取HTML中屬性節(jié)點(diǎn)的屬性值對(duì)圖中的HTML代碼進(jìn)行解析,通過Xpath中的路徑表達(dá)式輸出指定屬性節(jié)點(diǎn)的屬性值。七、XPath運(yùn)算符XPath表達(dá)式可返回節(jié)點(diǎn)集、字符串、邏輯值以及數(shù)字,表列出了可用在XPath表達(dá)式中的運(yùn)算符。案例——大于等于運(yùn)算查找指定節(jié)點(diǎn)信息

利用大于等于運(yùn)算符查找屬性值大于等于3的節(jié)點(diǎn),輸出該節(jié)點(diǎn)文本內(nèi)容。路徑表達(dá)式結(jié)合運(yùn)算符可疊加使用,常用方法如下:(1)選取多屬性的屬性節(jié)點(diǎn)(2)選取多個(gè)路徑。案例——或運(yùn)算查找節(jié)點(diǎn)信息利用or運(yùn)算符查找屬性值大于等于3的節(jié)點(diǎn),輸出該節(jié)點(diǎn)文本內(nèi)容。案例——選取多個(gè)路徑下的節(jié)點(diǎn)利用xpach對(duì)圖所示的代碼進(jìn)行解析,通過在路徑表達(dá)式中使用"|"運(yùn)算符,可以選取若多個(gè)路徑,輸出不同路徑下的節(jié)點(diǎn)信息。八、XML節(jié)點(diǎn)軸根據(jù)XML節(jié)點(diǎn)軸指定上述節(jié)點(diǎn)關(guān)系,節(jié)點(diǎn)軸可定義相對(duì)于當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)集,具體函數(shù)見表。案例——使用節(jié)點(diǎn)軸函數(shù)獲取祖先節(jié)點(diǎn)與同級(jí)節(jié)點(diǎn)任務(wù)3BeautifulSoup解析網(wǎng)頁任務(wù)引入完成了Xpath的學(xué)習(xí)后,小白對(duì)網(wǎng)頁解析有了基本的了解,這極大地鼓舞了他的學(xué)習(xí)熱情和奉獻(xiàn)自己力量的決心。他決定一鼓作氣,學(xué)習(xí)另一個(gè)網(wǎng)頁解析模塊BeautifulSoup。那么,Python中的BeautifulSoup模塊什么用途?使用方法與Xpath有何異同?知識(shí)準(zhǔn)備隨著的網(wǎng)絡(luò)種類的增多,尋找最適合的解析方法網(wǎng)絡(luò)爬蟲的迫切需求。BeautifulSoup提供一些簡單的、python式的函數(shù)用來處理導(dǎo)航、搜索、修改分析樹等功能,通過解析文檔為用戶提供需要抓取的數(shù)據(jù),不需要多少代碼就可以寫出一個(gè)完整的應(yīng)用程序。一、

BeautifulSoup的安裝BeautifulSoup是python的一個(gè)第三方庫,官網(wǎng)推薦在現(xiàn)在的項(xiàng)目中使用bs4,全稱BeautifulSoup4。使用前需要下載安裝,使用pip工具安裝二、

創(chuàng)建BeautifulSoup對(duì)象BeautifulSoup進(jìn)行網(wǎng)頁解析的原理是是將自動(dòng)將html文檔,轉(zhuǎn)化為BeautifulSoup對(duì)象,輸入文檔自動(dòng)轉(zhuǎn)換為Unicode編碼,輸出文檔轉(zhuǎn)換為utf-8編碼,這種解析方法不需要考慮編碼方式。案例——使用lxml解析html三、

通過屬性獲取節(jié)點(diǎn)內(nèi)容

BeautifulSoup將復(fù)雜HTML文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是Python對(duì)象,所有對(duì)象可以包括4種,最常用的是BeautifulSoup對(duì)象和Tag對(duì)象。(1)Tag對(duì)象:表示html中的一個(gè)節(jié)點(diǎn),使用BeautifulSoup函數(shù)解析Tag的內(nèi)容。(2)BeautifulSoup對(duì)象:表示整個(gè)html文本對(duì)象,也可當(dāng)作Tag對(duì)象使用(3)NavigableString對(duì)象:表示標(biāo)簽內(nèi)的文本對(duì)象(4)Comment對(duì)象:表示一個(gè)特殊的NavigableString對(duì)象,如果html節(jié)點(diǎn)內(nèi)存在注釋,那么顯示的是過濾掉注釋符號(hào)后保留的注釋文本??梢愿鶕?jù)html的結(jié)構(gòu)獲取對(duì)應(yīng)的節(jié)點(diǎn)內(nèi)容,具體方法見表。案例——獲取html文本案例——使用lxml解析html獲取節(jié)點(diǎn)文本若想獲取節(jié)點(diǎn)下全部子節(jié)點(diǎn)的文本內(nèi)容,可以用strings屬性得到一個(gè)生成器,但是這種方法可能有很多回車和空格。若想屏蔽回車和空格,可以使用stripped_strings屬性。四、

根據(jù)節(jié)點(diǎn)關(guān)系獲取節(jié)點(diǎn)HTML文檔所有的節(jié)點(diǎn)彼此間都存在關(guān)系。除文檔節(jié)點(diǎn)之外的每個(gè)節(jié)點(diǎn)都有父節(jié)點(diǎn)。大部分元素節(jié)點(diǎn)都有子節(jié)點(diǎn)。當(dāng)節(jié)點(diǎn)分享同一個(gè)父節(jié)點(diǎn)時(shí),它們就是同輩(同級(jí)節(jié)點(diǎn))。節(jié)點(diǎn)也可以擁有后代,后代指某個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn),或者這些子節(jié)點(diǎn)的子節(jié)點(diǎn),以此類推。節(jié)點(diǎn)也可以擁有先輩。先輩是某個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn),或者父節(jié)點(diǎn)的父節(jié)點(diǎn),以此類推。soup是HTML文檔解析得到的解析內(nèi)容,可以根據(jù)HTML的節(jié)點(diǎn)關(guān)系獲取對(duì)應(yīng)的節(jié)點(diǎn),具體方法見表。案例——獲取關(guān)聯(lián)節(jié)點(diǎn)利用節(jié)點(diǎn)關(guān)系方法,獲取圖蟲網(wǎng)HTML中的ul節(jié)點(diǎn)的所有關(guān)聯(lián)節(jié)點(diǎn),包含父節(jié)點(diǎn)、子節(jié)點(diǎn)、同級(jí)節(jié)點(diǎn)等。如果節(jié)點(diǎn)的父節(jié)點(diǎn)為空,則輸出父節(jié)點(diǎn)的上一級(jí)節(jié)點(diǎn)父輩節(jié)點(diǎn);如果節(jié)點(diǎn)的子節(jié)點(diǎn)為空,則輸出子節(jié)點(diǎn)的下一級(jí)節(jié)點(diǎn)孫輩節(jié)點(diǎn)。同級(jí)節(jié)點(diǎn)中若有為空的,則不輸出。五、

查找節(jié)點(diǎn)內(nèi)容查找節(jié)點(diǎn)時(shí),除了通過節(jié)點(diǎn)名稱和屬性設(shè)置查找條件,還可以使用其他條件來定義查找條件。案例——獲取符合條件的節(jié)點(diǎn)內(nèi)容find()它與find_all()方法唯一的區(qū)別是find_all()方法的返回結(jié)果是值包含一個(gè)元素的列表,而find()方法直接返回結(jié)果。案例——

獲取指定的節(jié)點(diǎn)內(nèi)容bs4中還提供其他的節(jié)點(diǎn)查找方法,使用方法與find_all相同,具體方法見表。六、

CSS選擇器查找節(jié)點(diǎn)內(nèi)容CSS屬性選擇器又被稱為CSS樣式屬性、CSS選擇器。HTML通過CSS選擇器對(duì)頁面中的元素實(shí)現(xiàn)一對(duì)一、一對(duì)多或者多對(duì)一的控制。用戶需要通過選擇對(duì)不同的HTML節(jié)點(diǎn)進(jìn)行選擇,并賦予各種樣式聲明,即可實(shí)現(xiàn)各種效果。CSS選擇器包括:標(biāo)記選擇器(name)、類別選擇

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論