欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python基于lxml模塊解析html獲取頁面內(nèi)所有葉子節(jié)點(diǎn)xpath路徑功能示例

 更新時間:2018年05月16日 12:19:34   作者:Together_CZ  
這篇文章主要介紹了Python基于lxml模塊解析html獲取頁面內(nèi)所有葉子節(jié)點(diǎn)xpath路徑功能,結(jié)合實例形式較為詳細(xì)的分析了Python使用lxml模塊進(jìn)行xml節(jié)點(diǎn)數(shù)據(jù)解析的相關(guān)操作技巧與注意事項,需要的朋友可以參考下

本文實例講述了Python基于lxml模塊解析html獲取頁面內(nèi)所有葉子節(jié)點(diǎn)xpath路徑功能。分享給大家供大家參考,具體如下:

因為需要使用葉子節(jié)點(diǎn)的路徑來作為特征,但是原始的lxml模塊解析之后得到的卻是整個頁面中所有節(jié)點(diǎn)的xpath路徑,不是我們真正想要的形式,所以就要進(jìn)行相關(guān)的處理才行了,差了很多網(wǎng)上的博客和文檔也沒有找到一個是關(guān)于輸出html中全部葉子節(jié)點(diǎn)的API接口或者函數(shù),也可能是自己沒有那份耐心,沒有找到合適的資源,只好放棄了尋找,但是這并不說明沒有其他的方法了,在對頁面全部節(jié)點(diǎn)的xpath輸出之后觀察得到的結(jié)果就是:

1.路徑之間存在包含性

2.葉子節(jié)點(diǎn)的路徑必然包含上一個葉子節(jié)點(diǎn)路徑到下一個葉子節(jié)點(diǎn)路徑之間的路徑

3.所有的葉子節(jié)點(diǎn)均不存在包含性

基于這些觀察就可以實踐了,我采用的方法是,設(shè)置一個標(biāo)志位,如果當(dāng)前路徑被下一條路徑包含的話就把下標(biāo)加1處理,直到遇上不包含的情況是這一條路徑就是一條葉子節(jié)點(diǎn)路徑,加入結(jié)果列表即可,經(jīng)檢驗和原始路徑列表對比后,結(jié)果路徑列表均不存在包含性,暫可認(rèn)為均為葉子節(jié)點(diǎn)的路徑,不敢確定的說是因為:竟沒有大量做實驗觀察是否有另類,不過方法是可行的,下面是具體實現(xiàn):

#!usr/bin/env python
#encoding:utf-8
'''''
__author__:沂水寒城
功能:得到頁面的葉子節(jié)點(diǎn)的xpath
'''
def get_leaf_node_xpath(one_page_xpath):
  '''''
  輸入:一個頁面的原始xpath路徑列表
  輸出:只包含頁面的葉子節(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_list
if __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')

打開保存的文件內(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]
/html/body/div[1]/div[1]/div
/html/body/div[1]/div[1]/div/div[1]
/html/body/div[1]/div[1]/div/div[1]/div
/html/body/div[1]/div[1]/div/div[1]/div/div[1]
/html/body/div[1]/div[1]/div/div[1]/div/a
/html/body/div[1]/div[1]/div/div[1]/div/form
/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[2]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/div
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/div/span
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[1]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[1]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[2]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[2]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[3]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[4]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[4]/a
/html/body/div[1]/div[1]/div/div[1]/div/div[2]
/html/body/div[1]/div[1]/div/div[2]
/html/body/div[1]/div[1]/div/div[2]/a[1]
/html/body/div[1]/div[1]/div/div[2]/a[2]
/html/body/div[1]/div[1]/div/div[2]/a[3]
/html/body/div[1]/div[1]/div/div[3]
/html/body/div[1]/div[1]/div/div[3]/a[1]
/html/body/div[1]/div[1]/div/div[3]/a[2]
/html/body/div[1]/div[1]/div/div[3]/a[3]
/html/body/div[1]/div[1]/div/div[3]/a[4]
/html/body/div[1]/div[1]/div/div[3]/a[5]
/html/body/div[1]/div[1]/div/div[3]/a[6]
/html/body/div[1]/div[1]/div/div[3]/a[7]
/html/body/div[1]/div[1]/div/div[3]/a[8]
/html/body/div[1]/div[1]/div/div[3]/a[9]
/html/body/div[1]/div[2]
/html/body/div[1]/div[2]/a[1]
/html/body/div[1]/div[2]/a[2]
/html/body/div[1]/div[2]/a[3]
/html/body/div[1]/div[2]/a[4]
/html/body/div[1]/div[2]/a[5]
/html/body/div[1]/div[2]/a[6]
/html/body/div[1]/div[2]/a[7]
/html/body/div[1]/div[2]/a[8]
/html/body/div[1]/div[2]/a[9]
/html/body/div[1]/div[3]
/html/body/div[1]/div[3]/div
/html/body/div[1]/div[3]/div/div
/html/body/div[1]/div[3]/div/div/div[1]
/html/body/div[1]/div[3]/div/div/div[2]
/html/body/div[1]/div[3]/div/div/div[2]/p
/html/body/div[1]/div[4]
/html/body/div[1]/div[4]/div
/html/body/div[1]/div[4]/div/div
/html/body/div[1]/div[4]/div/div/p[1]
/html/body/div[1]/div[4]/div/div/p[1]/a[1]
/html/body/div[1]/div[4]/div/div/p[1]/a[2]
/html/body/div[1]/div[4]/div/div/p[1]/a[3]
/html/body/div[1]/div[4]/div/div/p[1]/a[4]
/html/body/div[1]/div[4]/div/div/p[2]
/html/body/div[1]/div[4]/div/div/p[2]/a[1]
/html/body/div[1]/div[4]/div/div/p[2]/a[2]
/html/body/div[1]/div[4]/div/div/p[2]/a[3]
/html/body/div[1]/div[5]
/html/body/div[2]
/html/body/div[3]
/html/body/div[4]
0

最后一行的0只是為了代碼中列表能夠遍歷到最后一個路徑而不出現(xiàn)索引錯誤的一個簡單的處理,人為的添加了一個元素,沒有實際意義,也不會參與處理

leaf_xpath.txt內(nèi)容為:

/html/head/meta[1]
/html/head/meta[2]
/html/head/meta[3]
/html/head/meta[4]
/html/head/title
/html/body/p/comment()[1]
/html/body/p/comment()[2]
/html/body/p/comment()[3]
/html/body/p/meta
/html/body/div[1]/div[1]/div/div[1]/div/div[1]
/html/body/div[1]/div[1]/div/div[1]/div/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[1]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[2]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/div/span
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[1]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[2]/a
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[3]
/html/body/div[1]/div[1]/div/div[1]/div/form/span[3]/span/ul/li[4]/a
/html/body/div[1]/div[1]/div/div[1]/div/div[2]
/html/body/div[1]/div[1]/div/div[2]/a[1]
/html/body/div[1]/div[1]/div/div[2]/a[2]
/html/body/div[1]/div[1]/div/div[2]/a[3]
/html/body/div[1]/div[1]/div/div[3]/a[1]
/html/body/div[1]/div[1]/div/div[3]/a[2]
/html/body/div[1]/div[1]/div/div[3]/a[3]
/html/body/div[1]/div[1]/div/div[3]/a[4]
/html/body/div[1]/div[1]/div/div[3]/a[5]
/html/body/div[1]/div[1]/div/div[3]/a[6]
/html/body/div[1]/div[1]/div/div[3]/a[7]
/html/body/div[1]/div[1]/div/div[3]/a[8]
/html/body/div[1]/div[1]/div/div[3]/a[9]
/html/body/div[1]/div[2]/a[1]
/html/body/div[1]/div[2]/a[2]
/html/body/div[1]/div[2]/a[3]
/html/body/div[1]/div[2]/a[4]
/html/body/div[1]/div[2]/a[5]
/html/body/div[1]/div[2]/a[6]
/html/body/div[1]/div[2]/a[7]
/html/body/div[1]/div[2]/a[8]
/html/body/div[1]/div[2]/a[9]
/html/body/div[1]/div[3]/div/div/div[1]
/html/body/div[1]/div[3]/div/div/div[2]/p
/html/body/div[1]/div[4]/div/div/p[1]/a[1]
/html/body/div[1]/div[4]/div/div/p[1]/a[2]
/html/body/div[1]/div[4]/div/div/p[1]/a[3]
/html/body/div[1]/div[4]/div/div/p[1]/a[4]
/html/body/div[1]/div[4]/div/div/p[2]/a[1]
/html/body/div[1]/div[4]/div/div/p[2]/a[2]
/html/body/div[1]/div[4]/div/div/p[2]/a[3]
/html/body/div[1]/div[5]
/html/body/div[2]
/html/body/div[3]
/html/body/div[4]

針對這個問題暫時可以想到的方法就是這樣的,利用包含性來解決,沒有其他的新思路,如果還有新的思路歡迎交流學(xué)習(xí)!

PS:這里再為大家提供幾款關(guān)于xml操作的在線工具供大家參考使用:

在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.jb51.net/code/xmljson

在線格式化XML/在線壓縮XML
http://tools.jb51.net/code/xmlformat

XML在線壓縮/格式化工具:
http://tools.jb51.net/code/xml_format_compress

XML代碼在線格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python操作xml數(shù)據(jù)技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設(shè)計有所幫助。

相關(guān)文章

  • python爬取全國水雨情信息詳解

    python爬取全國水雨情信息詳解

    這篇文章主要為大家詳細(xì)介紹了python爬取全國水雨情信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Python實現(xiàn)正則表達(dá)式匹配任意的郵箱方法

    Python實現(xiàn)正則表達(dá)式匹配任意的郵箱方法

    今天小編就為大家分享一篇Python實現(xiàn)正則表達(dá)式匹配任意的郵箱方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python socket模塊實現(xiàn)的udp通信功能示例

    Python socket模塊實現(xiàn)的udp通信功能示例

    這篇文章主要介紹了Python socket模塊實現(xiàn)的udp通信功能,結(jié)合具體實例形式分析了Python使用socket模塊實現(xiàn)UDP通信客戶端與服務(wù)器端相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請求網(wǎng)站)

    python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請求網(wǎng)站)

    這篇文章主要介紹了python中requests模擬登錄的三種方式(攜帶cookie/session進(jìn)行請求網(wǎng)站),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Django自定義分頁與bootstrap分頁結(jié)合

    Django自定義分頁與bootstrap分頁結(jié)合

    這篇文章主要為大家詳細(xì)介紹了Django自定義分頁與bootstrap分頁結(jié)合使用的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Python編程給numpy矩陣添加一列方法示例

    Python編程給numpy矩陣添加一列方法示例

    這篇文章主要介紹了Python編程給numpy矩陣添加一列方法示例,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • 16行Python代碼實現(xiàn)微信聊天機(jī)器人并自動智能回復(fù)功能

    16行Python代碼實現(xiàn)微信聊天機(jī)器人并自動智能回復(fù)功能

    聊天機(jī)器人自動智能回復(fù)給我們的生活帶來了極大的便利,尤其在業(yè)務(wù)比較繁忙的時候,智能機(jī)器人給我們帶來極大的方便,今天小編教大家一招通過16行代碼實現(xiàn)微信聊天智能機(jī)器人,感興趣的朋友一起看看吧
    2022-01-01
  • python寫入文件自動換行問題的方法

    python寫入文件自動換行問題的方法

    這篇文章主要介紹了python寫入文件自動換行問題的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 關(guān)于Python錯誤重試方法總結(jié)

    關(guān)于Python錯誤重試方法總結(jié)

    在本篇文章里小編給網(wǎng)友們分享一篇關(guān)于關(guān)于Python錯誤重試方法總結(jié)內(nèi)容,有需要的朋友們跟著學(xué)習(xí)參考下。
    2021-01-01
  • python統(tǒng)計日志ip訪問數(shù)的方法

    python統(tǒng)計日志ip訪問數(shù)的方法

    這篇文章主要介紹了python統(tǒng)計日志ip訪問數(shù)的方法,涉及Python操作日志文件及正則匹配的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-07-07

最新評論