站長資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        python實例詳解之xpath解析

        本篇文章給大家?guī)砹岁P(guān)于python的相關(guān)知識,其中主要介紹了xpath的相關(guān)問題,XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,希望對大家有幫助。

        python實例詳解之xpath解析

        推薦學習:python教程

        XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文檔中查找信息的語言,它最初是用來搜尋XML文檔的,但是它同樣適用于HTML文檔的搜索

        XPath的選擇功能十分強大,它提供了非常簡明的路徑選擇表達式,另外,它還提供了超過100個內(nèi)建函數(shù),用于字符串、數(shù)值、時間的匹配以及節(jié)點、序列的處理等,幾乎所有我們想要定位的節(jié)點,都可以用XPath來選擇

        xpath解析原理:

        • 實現(xiàn)標簽的定位:實例化一個etree的對象,且需要將被解析的頁面源碼數(shù)據(jù)加載到該對象中。

        • 調(diào)用etree對象中的xpath方法結(jié)合著xpath表達式實現(xiàn)標簽的定位和內(nèi)容的捕獲。

        環(huán)境的安裝

        pip install lxml

        lxml是python的一個解析庫,支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高

        如何實例化一個etree對象

        1.將本地的html文檔中的源碼數(shù)據(jù)加載到etree對象中:

        etree. parse(filePath)#你的文件路徑

        2.可以將從互聯(lián)網(wǎng)上獲取的源碼數(shù)據(jù)加載到該對象中

        etree.HtML('page_ text')#page_ text互聯(lián)網(wǎng)中響應(yīng)的數(shù)據(jù)

        xpath 表達式

        表達式 描述
        nodename 選取此節(jié)點的所有子節(jié)點
        / 表示的是從根節(jié)點開始定位。表示的是一個層級。
        // 表示的是多個層級。可以表示從任意位置開始定位。
        . 選取當前節(jié)點
        選取當前節(jié)點的父節(jié)點
        @ 選取屬性
        * 通配符,選擇所有元素節(jié)點與元素名
        @* 選取所有屬性
        [@attrib] 選取具有給定屬性的所有元素
        [@attrib=‘value’] 選取給定屬性具有給定值的所有元素
        [tag] 選取所有具有指定元素的直接子節(jié)點
        [tag=‘text’] 選取所有具有指定元素并且文本內(nèi)容是text節(jié)點

        對上面表達式的實例詳解

        這是一個HTML的文檔

        <html lang="en"><head> 	<meta charset="UTF-8" /> 	<title>測試bs4</title></head><body> 	<p> 		<p>百里守約</p> 	</p> 	<p class="song"> 		<p>李清照</p> 		<p>王安石</p> 		<p>蘇軾</p> 		<p>柳宗元</p> 		<a href="http://www.song.com/" title="趙匡胤" target="_self"> 			<span>this is span</span> 		宋朝是最強大的王朝,不是軍隊的強大,而是經(jīng)濟很強大,國民都很有錢</a> 		<a href="" class="du">總為浮云能蔽日,長安不見使人愁</a> 		<img src="http://www.baidu.com/meinv.jpg" alt="" /> 	</p> 	<p class="tang"> 		<ul> 			<li><a href="http://www.baidu.com" title="qing">清明時節(jié)雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村</a></li> 			<li><a href="http://www.163.com" title="qin">秦時明月漢時關(guān),萬里長征人未還,但使龍城飛將在,不教胡馬度陰山</a></li> 			<li><a href="http://www.126.com" alt="qi">岐王宅里尋常見,崔九堂前幾度聞,正是江南好風景,落花時節(jié)又逢君</a></li> 			<li><a href="http://www.sina.com" class="du">杜甫</a></li> 			<li><a href="http://www.dudu.com" class="du">杜牧</a></li> 			<li><b>杜小月</b></li> 			<li><i>度蜜月</i></li> 			<li><a href="http://www.haha.com" id="feng">鳳凰臺上鳳凰游,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘</a></li> 		</ul> 	</p></body></html>

        從瀏覽器中打開是這樣的
        python實例詳解之xpath解析
        為了方便直觀,我們對寫個HTML文件進行本地讀取進行測試

        子節(jié)點和子孫節(jié)點的定位 / 和 //

        先來看子節(jié)點和子孫節(jié)點,我們從上往下找p這個節(jié)點,可以看到p的父節(jié)點是body,body父節(jié)點是html
        python實例詳解之xpath解析
        定位到這個HTML的p對象中,看上面html源碼,可以知道有三個p對象
        python實例詳解之xpath解析python實例詳解之xpath解析python實例詳解之xpath解析
        我們通過三種不同的方法來輸出這個節(jié)點的信息,可以看到輸出的是三個一樣的Element,也就是這三種方法實現(xiàn)的功能是一樣的。

        import requestsfrom lxml import etree tree = etree.parse('test.html')r1=tree.xpath('/html/body/p')	#直接從上往下挨著找節(jié)點r2=tree.xpath('/html//p')#跳躍了一個節(jié)點來找到這個p節(jié)點的對象r3=tree.xpath('//p')##跳躍上面所有節(jié)點來尋找p節(jié)點的對象r1,r2,r3>>([<Element p at 0x19d44765108>,   <Element p at 0x19d447658c8>,   <Element p at 0x19d44765588>],     [<Element p at 0x19d44765108>,   <Element p at 0x19d447658c8>,   <Element p at 0x19d44765588>],     [<Element p at 0x19d44765108>,   <Element p at 0x19d447658c8>,   <Element p at 0x19d44765588>])

        屬性定位

        如果我只想要p里面song這一個標簽,就可以對其屬性定位
        python實例詳解之xpath解析
        當然返回的還是一個element

        r4=tree.xpath('//p[@class="song"]')r4>>>[<Element p at 0x19d447658c8>]

        索引定位

        如果我只想獲得song里面的蘇軾的這個標簽
        我們找到了song,/p可以返回里面的所有標簽,

        tree.xpath('//p[@class="song"]/p')>>[<Element p at 0x19d4469a648>,  <Element p at 0x19d4469a4c8>,  <Element p at 0x19d4469af88>,  <Element p at 0x19d4469a148>]

        這個單獨返回的蘇軾的p標簽,要注意的是這里的索引不是從0開始的,而是1

        tree.xpath('//p[@class="song"]/p[3]')[<Element p at 0x19d4469af88>]

        取文本

        比如我想取杜牧這個文本內(nèi)容
        python實例詳解之xpath解析
        和上面一樣,我們要定位到杜牧的這個a標簽,首先要找到他的上一級 li ,這是第五個 li 里面的a所以就有了下面的寫法,text()是把element轉(zhuǎn)化為文本,當然上面的在后面加個text()都可以展示文本內(nèi)容。

        tree.xpath('//p[@class="tang"]//li[5]/a/text()')>>['杜牧']

        可以看到這個返回的是一個列表,如果我們想取里面的字符串,可以這樣

        tree.xpath('//p[@class="tang"]//li[5]/a/text()')[0]杜牧

        看一個更直接的,//li 直接定位到 li這個標簽,//text()直接將這個標簽下的文本提取出來。但要注意,這樣會把所有的li標簽下面的文本提取出來,有時候你并不想要的文本也會提取出來,所以最好還是寫詳細一點,如具體到哪個p里的li。

        tree.xpath('//li//text()')['清明時節(jié)雨紛紛,路上行人欲斷魂,借問酒家何處有,牧童遙指杏花村',  '秦時明月漢時關(guān),萬里長征人未還,但使龍城飛將在,不教胡馬度陰山',  '岐王宅里尋常見,崔九堂前幾度聞,正是江南好風景,落花時節(jié)又逢君',  '杜甫',  '杜牧',  '杜小月',  '度蜜月',  '鳳凰臺上鳳凰游,鳳去臺空江自流,吳宮花草埋幽徑,晉代衣冠成古丘']

        取屬性

        比如我想取下面這個屬性
        python實例詳解之xpath解析
        可以直接用@取屬性

        tree.xpath('//p[@class="song"]/img/@src')['http://www.baidu.com/meinv.jpg']

        或者如果我想取所有的href這個屬性,可以看到tang和song的所有href屬性

        tree.xpath('//@href')['http://www.song.com/',  '',  'http://www.baidu.com',  'http://www.163.com',  'http://www.126.com',  'http://www.sina.com',  'http://www.dudu.com',  'http://www.haha.com']

        爬蟲實戰(zhàn)之58同城房源信息

        #導(dǎo)入必要的庫import requestsfrom lxml import etree#URL就是網(wǎng)址,headers看圖一url='https://sh.58.com/ershoufang/'headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.7 Safari/537.36'}#對網(wǎng)站發(fā)起請求page_test=requests.get(url=url,headers=headers).text# 這里是將從互聯(lián)網(wǎng)上獲取的源碼數(shù)據(jù)加載到該對象中tree=etree.HTML(page_test)#先看圖二的解釋,這里li有多個,所里返回的li_list是一個列表li_list=tree.xpath('//ul[@class="house-list-wrap"]/li')#這里我們打開一個58.txt文件來保存我們的信息fp=open('58.txt','w',encoding='utf-8')#li遍歷li_listfor li in li_list: 	#這里 ./是對前面li的繼承,相當于li/p...     title=li.xpath('./p[2]/h2/a/text()')[0]     print(title+'n')     #把文件寫入文件     fp.write(title+'n')fp.close()

        圖一:
        python實例詳解之xpath解析
        圖二:.
        這里我們要提取所有的房源信息,可以看到每個小節(jié)點的上一個節(jié)點都是一樣的,我們要提取的是h2節(jié)點a里的房源信息,看圖三
        python實例詳解之xpath解析
        這里每個 /li 節(jié)點里面的子節(jié)點都是一樣的,所以我們可以先找到所有的li節(jié)點,再往下找我們想要的信息

        python實例詳解之xpath解析

        推薦學習:python教程

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
        主站蜘蛛池模板: 国产精品最新国产精品第十页| 国产成人久久精品区一区二区| 国产成人精品综合网站| 国产欧美日本精品| 国产精品视频久久| MM1313亚洲精品无码| 国产精品五月天强力打造| 精品无码一区二区三区爱欲 | 精品国产婷婷久久久| 午夜成人精品福利网站在线观看| 亚洲av无码成人精品区| 亚洲精品国精品久久99热一| 国产精品内射后入合集| 色综合久久精品中文字幕首页| 国产精品龙口护士门在线观看| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 四虎影院国产精品| 久久www免费人成精品香蕉| 亚洲av成人无码久久精品 | 国产成人精品免高潮在线观看| 国产成人精品免费视| 国产精品成人观看视频国产奇米| 日韩av无码久久精品免费| 国产精品麻豆高清在线观看 | 无码国模国产在线无码精品国产自在久国产 | 久久久久国产精品三级网| 亚洲色精品88色婷婷七月丁香| 精品福利视频一区二区三区| 亚洲国产成人精品不卡青青草原| 国产成人精品免费久久久久| 精品无码国产污污污免费网站国产 | 国产国产精品人在线视| 国产人妖乱国产精品人妖| 久久精品国产亚洲AV无码麻豆| 婷婷五月深深久久精品| 无码人妻精品一区二区三区久久| 午夜精品久久久久久99热| 久久亚洲精品无码AV红樱桃| 国内少妇偷人精品视频免费| 91麻豆精品国产自产在线观看一区| 国产精品高清一区二区三区|