首頁 > 上網技巧 > 電腦小技巧 > 網頁解析工具終結篇xpath語法

網頁解析工具終結篇xpath語法

時間:2019-12-11 10:06 作者:QQ地帶 我要評論

寫在前面
山竹(難怪都說越是美麗的東西越危險,這么美的名字下竟是如此狂野)終于過去了,囤貨泡面的日子真的不好受,希望天佑中華,無狂風再至!本期文章接著和大家講一下相關網頁解析工具xpath。如果大家熟悉文檔路徑結構的話,那么xpath絕對是一種較為容易掌握的網頁解析方式,這也是小編為什麼將其放在最后一期網頁解析系列文章的原因之一。小編一直覺得學東西一定要先啃掉難的,而后再去掌握簡單的(或者說此時你只需要較少的時間投入便可掌握簡單的知識)。廢話就不多說了,下面正式開始本期文章的介紹。
 
xpath簡介
XPath,全稱XML Path Language ,即XML路徑語言,它是一門在XML文檔中查找信息的語言。XPath雖然是被設計用來搜尋XML文檔,不過它也能很好地在HTML文檔中工作,并且大部分瀏覽器也支持通過XPath 來查詢節點。XPath既然叫Path,就是以路徑表達式的形式來指定元素,這些路徑表達式和我們在常規的電腦文件系統中看到的表達式非常相似。XPath選擇功能十分強大,它提供了非常簡潔明了的路徑選擇表達式。另外,它還提供了超過100個內建函數,用于字符串、數值、時間的匹配以及節點、序列的處理等。幾乎所有想要定位的節點,基本可以用XPath來選擇。關于xpath完整詳細的介紹可以參考官方文檔https://www.w3.org/TR/xpath/。
 
xpath語法主要表現為兩點:節點以及到達節點的路徑語法?紤]到路徑語法不僅存在絕對路徑,同時還有相當路徑以及多條件路徑,因此下面分四部分對xpath語法進行具體介紹:xpath節點、xpath基本路徑、xpath軸以及xpath運算符。最后用一個例子結束文章。
 
xpath節點
在XPath中,XML文檔是被作為節點樹來對待的,有七種類型的節點:元素、屬性、文
本、命名空間、處理指令、注釋以及文檔(根)節點。樹的根被稱為文檔節點或者根節點。以下面的XML文檔為例進行說明,文檔如下:
 
<?xml version = "1.0" encoding = "ISO-8859-1"?>
<classroom>
    <student>
        <id>l001</id>
        <name lang="en"> marry </name>
        <age>20</age>
        <country>China</country>
    </student>
</classroom>
上面XML文檔中節點包括:(文檔節點)、100l (元素節點)、lang=”en”(屬性節點)、marry(文本)。接著說一下節點關系,包括父(Parent)、子(Children)、同胞(Sibling)、先輩(Ancestor)、后代(Descendant)。在上面的文檔中:
 
student元素是id、name、age以及country元素的父。
id、name、age以及country元素都是student元素的子。
id、name、age以及country元素都是同胞節點,擁有相同的父節點。
name元素的先輩是student元素和classroom元素。
classroom的后代是id、name、age以及country元素。
xpath基本路徑選擇
XPath使用路徑表達式來選取XML文擋中的節點或節點集。節點是沿著路徑或者步來選取的。接下來的重點是如何選取節點,下面給出一個XML文檔進行分析:
 
<?xml version = "1.0" encoding = "ISO-8859-1"?>
<classroom>
    <Student>
        <id>1001</id>
        <name lang = "en">marry </name>
        <age>20</age>
        <country>China</country>
    </Student>
    <Student>
        <id>1002</id>
        <name lang = "en">jack </name>
        <age>25</age>
        <country>USA</country>
    </Student>
</classroom>
這里首先給出一下xpath中常用的一些路徑選擇規則:
 
表達式 描述
nodename 選擇此節點下的所有節點
/ 選擇當前節點下的子節點
// 選擇當前節點下的所有子孫節點
. 選擇當前節點
.. 選擇當前節點的父節點
@ 選擇屬性
下面便使用這些選擇規則對上文中所給出的xml文檔進行選擇演示。
 
路徑表達式 選擇結果
classroom 選取classroom元素的所有子節點
/classroom 選取根元素classroom
/classroom/student 選取屬于classroom的所有student子元素
//student 選取所有student子元素,而不管它們在文檔中的位置
/classroom//student 選擇屬于classroom元素的后代中的所有student元素,而不管它們位于classroom之下的什么位置
//@lang 選取名為lang的所有屬性
上面例子實現的效果都是選取了所有符合條件的節點,然而如何選取某個特定的節點或者包含某一個指定的值的節點?這就需要用到謂語,謂語被嵌在方括號中,見下例。
 
路徑表達式 選擇結果
/classroom/student[1] 選取屬于classroom元素的第一個student子元素
/classroom/student[last()] 選取屬于classroom元素的最后一個student子元素
/classroom/student[last()-1] 選取屬于classroom元素的倒數第二個student子元素
/classroom/student[position()<3] 選取最前面兩個屬于classroom元素的student子元素
//name[@lang] 選取所有擁有名為lang屬性的name元素
//name[@lang=”en”] 選取所有name元素,且這些元素擁有值為en的lang屬性
/classroom//student[age>20] 選取classroom元素的所有student元素,且其中age元素的值須大于20
/classroom//student[age>20]/name 選取classroom元素中的student元素的所有name元素,且其中的age元素值須大于20
XPath在進行節點選取時也可以使用通配符“*”匹配未知的元素所有元素,同時使用操作符|一次選取多條路徑,見下例。
 
路徑表達式 選擇結果
/classroom/* 選取classroom元素的所有子元素
//* 選取文檔中的所有元素
//name[@*] 選取所有帶有屬性的name元素
//student/name | //studengt/age 選取stndent元素所有name和age元素
/classroom/student/name | //age 選取屬于classroom元素的student元素的所有name元素,以及文檔中所有age元素
xpath軸
軸定義了所選節點與當前節點之間的樹關系。在Python爬蟲開發中,提取網頁中信息
會遇到這種情況:首先提取到一個節點的信息,然后想在這個節點的基礎上提取它的子節點或父節點,這時就會用到軸的概念。軸的存在會使提取變得更加靈活和準確。
 
在說軸的用法之前,需要了解位置路徑表達式中的相對位置路徑、絕對位置路徑和步的
概念。位置路徑可以是絕對的,也可以是相對的。絕財路徑起始于正斜杠(/),而相對路徑不會這樣。在兩種情況中,位置路徑均包括一個或多個步,每個步均被斜杠分割:/step/ step/ …(絕時位置路徑), step/step/…(相對位置路徑)。
 
步包括:軸、節點測試、零個或者更多謂語,用來更深入地提煉所選的節點集。步的語法為:軸名稱::節點測試[謂語]。下面先給出軸的語法規則。
 
軸名稱 含義
child 選取當前節點的所有子元素
child 選取當前節點的父節點
ancestor 選取當前節點的所有先輩(父、祖父等)
ancestor-or-self 選取當前節點的所有先輩(父、祖父等)以及當前節點本身
descendant 選取當前節點的所有后代元素(子、孫等)
descendant-or-self 選取當前節點所有后代元素(子、孫等)以及當前節點本身
preceding 選取文檔中當前節點的開始標記之前的所有節點
following 選取文檔中當前節點的結束標記之后的所有節點
preceding-sibling 選取當前節點之前的所有同級節點
following-sibling 選取當前節點之后的所有同級節點
self 選取當前節點之后的所有同級節點
attribute 選取當前節點的所有屬性
namespace 選取當前節點的所有命名空間節點
再次給出一個xml文檔作為演示例子。
 
<?xml version = "1.0" encoding = "ISO-8859-1"?>
<classroom>
    <Student>
        <id>1001 </id>
        <name lang = "en">marry </name>
        <age>20</age>
        <country>China</country>
    </Student>
    <Student>
        <id>1002 </id>
        <name lang = "en">jack </name>
        <age>25</age>
        <country>USA</country>
    </Student>
    <teacher>
        <classid>l</classid>
        <name lang = "en">tom </name>
        <age>50</age>
        <country>USA</country>
    </teacher>
</classroom>
路徑表達式 選擇結果
選取當前classrnom節點中子元素的teacher節點 /classroom/child: :teacher
選取所有時節點的父節點 //id/parent::*
選取所有以classid為子節點的祖先節點 //classid/ancestor::*
選取classroom節點下的所有后代節點 /classroom/descendant::*
選取所有以student為父節點的id元素 //student/descendant::id
選取所有classid元素的祖先節點及本身 //classid/ancestor-or-self::*
選擇/classroom/student本身及所有后代元素 /classroom/student/descendant-or-self::*
選取/classroom/teacher之前的所有同級節點,結果就是選擇了所有的student 節點 /classroom/teacher/preceding-sibling::*
選取/classroom中第二個student之后的所有同級節點,結果就是選擇了teacher 節點 /classroom/student[2]/following-sibling::*
xpath運算符
XPath表達式可返回節點集、字符串、邏輯值以及數字。以下給出相關的運算符。
 
運算符 定義 實例 含義
| 計算兩個節點集 //student/name | //student/age 選取student元素的所有name和age元素
+,-,*,div,mod 加法,減法,乘法,除法,求余 /classroom/student[age=l9+1] 選取classroom元素的所有student 元素,且其中的age 元素的值須等于20
=,!=,<,>,<=,>= 等于,不等于,小于,大于,小于等于,大于等于 /classroom/student[age<20] 選取classroom元素的所有student元素,且其中的age元素的值須小于20
or,and 或,與 /classroom/student[age>20 and age <25] 選取classroom元素的所有student元素,其中的age元素的值須大于20,且小于25
實例
python中使用xpath需要導入lxml庫,如果你尚未安裝,那么可以自行谷歌,完成安裝后就可以正常使用xpath選擇器了。下面先給出一個html代碼文本,而后演示怎么使用xpath獲取數據。
 
text = """
<div>
<ul>
<li class="item-0"><a href="linkl.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="links.html">fifth item</a></li>
</ul>
</div>
"""
from lxml import etree
html = etree.HTML(text)
first_item = html.xpath('/ul/li[1]/text()')
>>> print(first_item)
first item
第一步是從lxml庫中導入etree子模塊,而后使用etree子模塊中的HTML函數初始化網頁代碼,而后使用etree子模塊中的xpath函數根據路徑選擇要素,這里小編要選擇第一個li要素下的文本內容,所以這里使用/ul/li[1]首先定位到第一個li元素下,而后使用text()函數獲取其中的文本內容。通過這個小例子,各位應該知道了xpath在網頁解析中的快速。
 
后記
本文講到這里就暫告一段落了,本期文章和大家聊了一下xpath語法以及lxml解析庫的用法,了解了怎么使用lxml庫中的xpath函數去獲取網頁中的相關內容。本期文章將作為網頁解析工具篇的最后一篇,lxml將與beautifulsoup以及正則表達式共同成為小編網頁解析的工具,也希望大家能夠至少掌握一種。最后再次感謝你們的支持與鼓勵,你們的陪伴是小編前進的動力!

標簽: xpath
頂一下
(0)
0%
踩一下
(0)
0%

Google提供的廣告

辽宁11选5任选四遗漏 管家婆精选心水资料中特网 晨光生物股票股吧 快乐8韩国开奖查询 pk10官网计划 东方6十1专家推号 刘伯温三肖选一肖 今日上证指数大盘走势图 快三口诀逢3下15见4出26 欧冠冠军历届 跟宝博棋牌一样的棋牌