Python xpath表達式如何實現數據處理

 更新時間:2020-06-14 04:45:10   作者:佚名   我要評論(0)

xpath表達式
1. xpath語法




<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>999</price>
</book>
<book>
<title lang="eng">Learning X

xpath表達式

1. xpath語法

<bookstore>
<book>
 <title lang="eng">Harry Potter</title>
 <price>999</price>
</book>
<book>
 <title lang="eng">Learning XML</title>
 <price>888</price>
</book>
</bookstore>

1.1 選取節點

XPath 使用路徑表達式來選取 XML 文檔中的節點或者節點集。這些路徑表達式和我們在常規的電腦文件系統中看到的表達式非常相似。

使用chrome插件選擇標簽時候,選中時,選中的標簽會添加屬性class="xh-highlight"

下面列出了最有用的表達式:

表達式 描述
nodename 選中該元素。
/ 從根節點選取、或者是元素和元素間的過渡。
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
. 選取當前節點。
.. 選取當前節點的父節點。
@ 選取屬性。
text() 選取文本。

實例

路徑表達式 結果
bookstore 選擇bookstore元素。
/bookstore 選取根元素 bookstore。注釋:假如路徑起始于正斜杠( / ),則此路徑始終代表到某元素的絕對路徑!
bookstore/book 選取屬于 bookstore 的子元素的所有 book 元素。
//book 選取所有 book 子元素,而不管它們在文檔中的位置。
bookstore//book 選擇屬于 bookstore 元素的后代的所有 book 元素,而不管它們位于 bookstore 之下的什么位置。
//book/title/@lang 選擇所有的book下面的title中的lang屬性的值。
//book/title/text() 選擇所有的book下面的title的文本。

  • 選擇所有的h1下的文本
  • //h1/text()
  • 獲取所有的a標簽的href
  • //a/@href
  • 獲取html下的head下的title的文本
  • /html/head/title/text()
  • 獲取html下的head下的link標簽的href
  • /html/head/link/@href

1.2 查找特定的節點

路徑表達式 結果
//title[@lang="eng"] 選擇lang屬性值為eng的所有title元素
/bookstore/book[1] 選取屬于 bookstore 子元素的第一個 book 元素。
/bookstore/book[last()] 選取屬于 bookstore 子元素的最后一個 book 元素。
/bookstore/book[last()-1] 選取屬于 bookstore 子元素的倒數第二個 book 元素。
/bookstore/book[position()>1] 選擇bookstore下面的book元素,從第二個開始選擇
//book/title[text()='Harry Potter'] 選擇所有book下的title元素,僅僅選擇文本為Harry Potter的title元素
/bookstore/book[price>35.00]/title 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00。

注意點: 在xpath中,第一個元素的位置是1,最后一個元素的位置是last(),倒數第二個是last()-1

1.3 選取未知節點

XPath 通配符可用來選取未知的 XML 元素。

通配符 描述
* 匹配任何元素節點。
@* 匹配任何屬性節點。
node() 匹配任何類型的節點。

實例

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式 結果
/bookstore/* 選取 bookstore 元素的所有子元素。
//* 選取文檔中的所有元素。
//title[@*] 選取所有帶有屬性的 title 元素。

1.4 選取若干路徑

通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。

實例

在下面的表格中,我們列出了一些路徑表達式,以及這些表達式的結果:

路徑表達式 結果
//book/title | //book/price 選取 book 元素的所有 title 和 price 元素。
//title | //price 選取文檔中的所有 title 和 price 元素。
/bookstore/book/title | //price 選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。

實例:

from lxml import etree
text = ''' <div> <ul> 
    <li class="item-1"><a href="link1.html" rel="external nofollow" >first item</a></li> 
    <li class="item-1"><a href="link2.html" rel="external nofollow" >second item</a></li> 
    <li class="item-inactive"><a href="link3.html" rel="external nofollow" >third item</a></li> 
    <li class="item-1"><a href="link4.html" rel="external nofollow" >fourth item</a></li> 
    <li class="item-0"><a href="link5.html" rel="external nofollow" >fifth item</a> 
    </ul> </div> '''

html = etree.HTML(text)

#獲取href的列表和title的列表
href_list = html.xpath("http://li[@class='item-1']/a/@href")
title_list = html.xpath("http://li[@class='item-1']/a/text()")


#組裝成字典
for href in href_list:
  item = {}
  item["href"] = href
  item["title"] = title_list[href_list.index(href)]
  print(item)

# 如果取到的是一個節點,返回的是element對象,可以繼續使用xpath方法,對此我們可以在后面的數據提取過程中:先根據某個標簽進行分組,分組之后再進行數據的提取
li_list = html.xpath("http://li[@class='item-1']")

#在每一組中繼續進行數據的提取
for li in li_list:
  item = {}
  item["href"] = li.xpath("./a/@href")[0] if len(li.xpath("./a/@href"))>0 else None
  item["title"] = li.xpath("./a/text()")[0] if len(li.xpath("./a/text()"))>0 else None
  print(item)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • python定位xpath 節點位置的方法
  • python 中xpath爬蟲實例詳解
  • Python lxml解析HTML并用xpath獲取元素的方法
  • python的xpath獲取div標簽內html內容,實現innerhtml功能的方法
  • Python基于lxml模塊解析html獲取頁面內所有葉子節點xpath路徑功能示例
  • Python中利用xpath解析HTML的方法
  • python爬蟲之xpath的基本使用詳解
  • python使用xpath中遇到:<Element a at 0x39a9a80>到底是什么?

相關文章

  • Python xpath表達式如何實現數據處理

    Python xpath表達式如何實現數據處理

    xpath表達式 1. xpath語法 <bookstore> <book> <title lang="eng">Harry Potter</title> <price>999</price> </book> <book> <title lang="eng">Learning X
    2020-06-14
  • Python Django搭建網站流程圖解

    Python Django搭建網站流程圖解

    1. 創建Django REST framework工程 1.1手動創建工程文件夾 1.2進去工程文件夾內,執行命令:django-admin startproject web_project創建工程目錄 1.3修改,添加目錄
    2020-06-14
  • 簡單了解Spring Web相關模塊運行原理

    簡單了解Spring Web相關模塊運行原理

    Spring 的Web層中有4個模塊,分別為spring-web, spring-webmvc, spring-websocket 和 spring-webmvc-portlet。 spring-web spring-web 提供了核心的Web相關功能的
    2020-06-14
  • python如何更新包

    python如何更新包

    Python安裝新包,pip是很好用的安裝工具。 pip list 可以查詢所有已安裝的包和版本。怎么知道本地安裝包的版本是否有可以更新的新版本呢?通過pip list函數可以實現
    2020-06-14
  • numpy的Fancy Indexing和array比較詳解

    numpy的Fancy Indexing和array比較詳解

    一:Fancy Indexing import numpy as np #Fancy Indexing x = np.arange(16) np.random.shuffle(x) print(x) #打印所有的元素 print(x[2])#獲取某個元素
    2020-06-14
  • python屬于解釋語言嗎

    python屬于解釋語言嗎

    Python是一門解釋型語言? Python是一門解釋性語言,我就這樣一直相信下去,直到發現了*.pyc文件的存在。 如果是解釋型語言,那么生成的*.pyc文件是什么呢?c應該是
    2020-06-14
  • 使用sklearn對多分類的每個類別進行指標評價操作

    使用sklearn對多分類的每個類別進行指標評價操作

    今天晚上,筆者接到客戶的一個需要,那就是:對多分類結果的每個類別進行指標評價,也就是需要輸出每個類型的精確率(precision),召回率(recall)以及F1值(F1-s
    2020-06-14
  • python能開發游戲嗎

    python能開發游戲嗎

    python可以寫游戲,但不適合。下面我們來分析一下具體原因。 用錘子能造汽車嗎? 誰也沒法說不能吧?歷史上也確實曾經有些汽車,是用錘子造出來的。但一般來說,還是
    2020-06-14
  • python編寫softmax函數、交叉熵函數實例

    python編寫softmax函數、交叉熵函數實例

    python代碼如下: import numpy as np # Write a function that takes as input a list of numbers, and returns # the list of values given by the softmax
    2020-06-14
  • python開發前景如何

    python開發前景如何

    隨著近幾年Python的飛速發展,應用范圍逐步趨于廣泛,后端開發、前端開發、爬蟲、金融量化分析、人工智能、自動化運維、自動化運維、大數據,Python都有涉及。Pytho
    2020-06-14

最新評論

买宝宝用品赚钱吗 外盘期货报警立案困难吗 历年上证指数图 湖北11选5基本走势图 排列3杀码图 青海11选5今天开奖 金牌配资 辽宁11选5怎么攻克 重庆彩票幸运农场开奖 江西多乐彩11选5开奖结果 江西快3综合走势图 大发快三彩票平台 南洋股份股吧 辽宁11选5投注表 天天三分彩是官方开的吗 东莞炒股配资公司 天津快乐十分