本文實(shí)例講述了Python基于lxml模塊解析html獲取頁(yè)面內(nèi)所有葉子節(jié)點(diǎn)xpath路徑功能。分享給大家供大家參考,具體如下:
因?yàn)樾枰褂萌~子節(jié)點(diǎn)的路徑來(lái)作為特征,但是原始的lxml模塊解析之后得到的卻是整個(gè)頁(yè)面中所有節(jié)點(diǎn)的xpath路徑,不是我們真正想要的形式,所以就要進(jìn)行相關(guān)的處理才行了,差了很多網(wǎng)上的博客和文檔也沒(méi)有找到一個(gè)是關(guān)于輸出html中全部葉子節(jié)點(diǎn)的API接口或者函數(shù),也可能是自己沒(méi)有那份耐心,沒(méi)有找到合適的資源,只好放棄了尋找,但是這并不說(shuō)明沒(méi)有其他的方法了,在對(duì)頁(yè)面全部節(jié)點(diǎn)的xpath輸出之后觀察得到的結(jié)果就是:
1.路徑之間存在包含性
2.葉子節(jié)點(diǎn)的路徑必然包含上一個(gè)葉子節(jié)點(diǎn)路徑到下一個(gè)葉子節(jié)點(diǎn)路徑之間的路徑
3.所有的葉子節(jié)點(diǎn)均不存在包含性
基于這些觀察就可以實(shí)踐了,我采用的方法是,設(shè)置一個(gè)標(biāo)志位,如果當(dāng)前路徑被下一條路徑包含的話就把下標(biāo)加1處理,直到遇上不包含的情況是這一條路徑就是一條葉子節(jié)點(diǎn)路徑,加入結(jié)果列表即可,經(jīng)檢驗(yàn)和原始路徑列表對(duì)比后,結(jié)果路徑列表均不存在包含性,暫可認(rèn)為均為葉子節(jié)點(diǎn)的路徑,不敢確定的說(shuō)是因?yàn)椋壕箾](méi)有大量做實(shí)驗(yàn)觀察是否有另類,不過(guò)方法是可行的,下面是具體實(shí)現(xiàn):
#!usr/bin/env python#encoding:utf-8'''''__author__:沂水寒城功能:得到頁(yè)面的葉子節(jié)點(diǎn)的xpath'''def get_leaf_node_xpath(one_page_xpath): ''''' 輸入:一個(gè)頁(yè)面的原始xpath路徑列表 輸出:只包含頁(yè)面的葉子節(jié)點(diǎn)的xpath列表 ''' one_page_xpath.append('0') leaf_node_xpath_list=[] for i in range(len(one_page_xpath)-1): j=i+1 one_xpath=one_page_xpath[i] two_xpath=one_page_xpath[j] if one_xpath in two_xpath: one_xpath=two_xpath two_xpath=one_page_xpath[j+1] else: leaf_node_xpath_list.append(one_xpath) return leaf_node_xpath_listif __name__ == '__main__': with open('baidu.txt') as f: html=f.read() htree, one_page_xpath=get_clean_allnodes_xpath(html) leaf_node_xpath_list=get_leaf_node_xpath(one_page_xpath) print leaf_node_xpath_list with open('data/dom_leaf_xpath/original_xpath.txt', 'w') as f1: for one_line in one_page_xpath: f1.write(one_line.strip()+'/n') with open('data/dom_leaf_xpath/leaf_xpath.txt', 'w') as f2: for one_line in leaf_node_xpath_list: f2.write(one_line.strip()+'/n')打開(kāi)保存的文件內(nèi)容為:
original_xpath.txt內(nèi)容為:
/html
/html/head
/html/head/meta[1]
/html/head/meta[2]
/html/head/meta[3]
/html/head/meta[4]
/html/head/title
/html/body
/html/body/p
/html/body/p/comment()[1]
/html/body/p/comment()[2]
/html/body/p/comment()[3]
/html/body/p/meta
/html/body/div[1]
/html/body/div[1]/div[1]
新聞熱點(diǎn)
疑難解答
圖片精選