python爬蟲教程之bs4解析和xpath解析詳解
bs4解析
原理:
1.實(shí)例化一個(gè)BeautifulSoup對(duì)象,并且將頁(yè)面源碼數(shù)據(jù)加載到該對(duì)象中
2.通過(guò)調(diào)用BeautifulSoup對(duì)象中相關(guān)的屬性或者方法進(jìn)行標(biāo)簽定位和數(shù)據(jù)提取
如何實(shí)例化BeautifulSoup對(duì)象:
from bs4 import BeautifulSoup
BeautifulSoup(參數(shù)一,參數(shù)二)
參數(shù)一為文件描述符,參數(shù)二為解析器,一般為’lxml’
一對(duì)象的實(shí)例化:
1.將本地的html文檔中的數(shù)據(jù)加載到該對(duì)象中
fp = open( './test.html','r',encoding='utf-8') soup=BeautifulSoup(fp,'lxml')
2.將互聯(lián)網(wǎng)上獲取的頁(yè)面源碼加載到該對(duì)象中
page_text =response.text soup=BeatifulSoup(page_text,'lxml')
soup指初始化的BeautifulSoup對(duì)象
用于數(shù)據(jù)解析的方法和屬性:
1.soup.tagName:返回的是文檔中第一次出現(xiàn)的tagName對(duì)應(yīng)的標(biāo)簽
2.soup.find():
(1).find( ‘tagName’):等同于soup.tagName
(2).屬性定位:soup.find(‘div’,class_/id/或者其他屬性=‘song’)
定位到< div class=“song”>/< div id=“song”>的標(biāo)簽下
class如果沒有加_則代表關(guān)鍵字
3.soup.find_all(‘tagName’):返回符合要求的所有標(biāo)簽(列表)
soup對(duì)象: <div class="tang"> <ul> <li><a rel="external nofollow" title= "ging">清明時(shí)節(jié)雨紛紛,路上行人欲斷魂,借問(wèn)酒家何處有,牧童遙指杏花村</a></1i> <li><a rel="external nofollow" title="qin">秦時(shí)明月漢時(shí)關(guān),萬(wàn)里長(zhǎng)征人未還,但使龍城飛將在,不教胡馬度陰山</a></1i> <li><a href=" http://ww.126.com" rel="external nofollow" alt="qi ">歧王宅里尋常見,崔九堂前幾度聞,正是江南好風(fēng)景,落花時(shí)節(jié)又逢君</a></li> <li><a href="http: //www.sina.com" rel="external nofollow" class="du">杜甫</a></li> <li><a rel="external nofollow" class="du">杜牧</a></li> <li><b>杜小月</b></li> <li><i>度蜜月</i></li> <li><a rel="external nofollow" feng">鳳凰臺(tái)上鳳凰游,鳳去臺(tái)空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a></li> </ul> </div>
4.select:
- select(‘某種選擇器(id,class,標(biāo)簽…選擇器)’),返回的是一個(gè)列表。
標(biāo)簽什么都不加,class前面加. id前面加#
層級(jí)選擇器:
>表示的是一個(gè)層級(jí);空格表示的多個(gè)層級(jí)
soup.select( '.tang > ul > li > a') soup.select( '.tang >ul a') 結(jié)果為:[<a title= "ging">清明時(shí)節(jié)雨紛紛,路上行人欲斷魂,借問(wèn)酒家何處有,牧童遙指杏花村</a>, <a title="qin">秦時(shí)明月漢時(shí)關(guān),萬(wàn)里長(zhǎng)征人未還,但使龍城飛將在,不教胡馬度陰山</a>, <a href=" http://ww.126.com"alt="qi ">歧王宅里尋常見,崔九堂前幾度聞,正是江南好風(fēng)景,落花時(shí)節(jié)又逢君</a>, <a href="http: //www.sina.com" class="du">杜甫</a>, <a class="du">杜牧</a>, <a >鳳凰臺(tái)上鳳凰游,鳳去臺(tái)空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a>]
5.獲取標(biāo)簽之間的文本數(shù)據(jù):
-soup.a.text/string/get_text()
-text/get_text():可以獲取某一個(gè)標(biāo)簽中所有的文本內(nèi)容
-string:只可以獲取該標(biāo)簽下面直系的文本內(nèi)容
6.獲取標(biāo)簽中屬性值:
soup.a[‘屬性值’]
print(soup.select( '.tang > ul > li > a') [0]['href']) 結(jié)果: www.baidu.com
xpath解析
最常用且最便捷高效的一種解析方式。通用性。
xpath解析原理:
1.實(shí)例化一個(gè)etree的對(duì)象,且需要將被解析的頁(yè)面源碼數(shù)據(jù)加載到該對(duì)象中。
2調(diào)用etree對(duì)象中的xpath方法結(jié)合著xpath表達(dá)式實(shí)現(xiàn)標(biāo)簽的定位和內(nèi)容的捕獲。
實(shí)例化一個(gè)etree對(duì)象:
from lxml import etree
-1.將本地的html文檔中的源碼數(shù)據(jù)加載到etree對(duì)象中:
etree.parse(filePath)
-2.可以將從互聯(lián)網(wǎng)上獲取的源碼數(shù)據(jù)加載到該對(duì)象中
etree.HTML( 'page_text')
xpath( ‘xpath表達(dá)式’)
xpath表達(dá)式:(返回一個(gè)列表)
-/:表示的是從根節(jié)點(diǎn)開始定位。表示的是一個(gè)層級(jí)。
-//:表示的是多個(gè)層級(jí)??梢员硎緩娜我馕恢瞄_始定位。
-屬性定位://div[@class=‘song’] tag[@attrname=‘attrvalue’]
-索引定位://div[@class=‘song’]/p[3]
索引從1開始的
取文本:
- /text()獲取的是標(biāo)簽中直系的文本內(nèi)容
- //text(標(biāo)簽中非直系的文本內(nèi)容(所有的文本內(nèi)容)
取屬性:
- /@attrName
- eg:/img/@src
- ./表示定位到當(dāng)前位置(局部解析)
多個(gè)xpath之間用|分割:
- tree.xpath(’//div[@class=‘song’]/p[3] | //div[@class=‘song’]’)
總結(jié)
到此這篇關(guān)于python爬蟲教程之bs4解析和xpath解析的文章就介紹到這了,更多相關(guān)python bs4和xpath解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 給DataFrame增加index行名和columns列名的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 給DataFrame增加index行名和columns列名的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例
下面小編就為大家分享一篇用Python寫腳本,實(shí)現(xiàn)完全備份和增量備份的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python?add()集合中添加元素的實(shí)現(xiàn)
本文主要介紹了Python?add()集合中添加元素的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗
本文主要介紹了淺談Python實(shí)時(shí)檢測(cè)CPU和GPU的功耗,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01Python+streamlit實(shí)現(xiàn)輕松創(chuàng)建人事系統(tǒng)
streamlit 是 基于 Python 的一個(gè)非常強(qiáng)大的 web 構(gòu)建系統(tǒng),通過(guò)該類庫(kù),我們可以實(shí)現(xiàn)不需要編寫一行前端代碼而構(gòu)建一個(gè)完整的 Web 應(yīng)用。下面我們就來(lái)編寫一個(gè)簡(jiǎn)單的人事系統(tǒng)吧2023-02-02OpenCV角點(diǎn)檢測(cè)的實(shí)現(xiàn)示例
角點(diǎn)通常被定義為兩條邊的交點(diǎn),本文主要介紹了OpenCV角點(diǎn)檢測(cè)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python用20行代碼實(shí)現(xiàn)完整郵件功能
這篇文章主要介紹了如何使用Python實(shí)現(xiàn)完整郵件功能的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容,希望能幫助到您2021-09-09