63.1-XPath概念和實(shí)例

人們對于不確定之事的興趣,永遠(yuǎn)多于已經(jīng)確定之事骤竹,過去和現(xiàn)在經(jīng)常被人們遺忘尿贫。所以,能夠編織夢想的人蒂阱,永遠(yuǎn)是最受歡迎之人!

總結(jié):

  1. HTML與XML的差別
    HTML是用來做數(shù)據(jù)格式的顯示的锻全,里面的數(shù)據(jù)是為了用標(biāo)簽在瀏覽器中繪制出來的;
    XML的創(chuàng)造是為了在系統(tǒng)之間傳輸數(shù)據(jù)蒜危,樹形結(jié)構(gòu)虱痕、標(biāo)簽;費(fèi)流量;可以用JSON
  2. XML中辐赞,<> 內(nèi)的用來存放屬性\類 ; 用條件 @ 來匹配硝训; [] 內(nèi)些匹配條件
  3. node() \ local-name() \ 函數(shù)返回 為節(jié)點(diǎn)

1. HTML解析

HTML的內(nèi)容返回給瀏覽器响委,瀏覽器就會解析它新思,并對它渲染。
HTML 超文本表示語言赘风,設(shè)計(jì)的初衷就是為了超越普通文本夹囚,讓文本表現(xiàn)力更強(qiáng)。
XML擴(kuò)展標(biāo)記語言邀窃,不是為了代替HTML荸哟,而是覺得HTML的設(shè)計(jì)中包含了過多的格式,承擔(dān)了一部分?jǐn)?shù)據(jù)之外的
任務(wù)瞬捕,所以才設(shè)計(jì)了XML只用來描述數(shù)據(jù)鞍历。
HTML和XML都有結(jié)構(gòu),使用標(biāo)記形成樹型的嵌套結(jié)構(gòu)肪虎。DOM(Document Object Model)來解析這種嵌套樹型
結(jié)構(gòu)劣砍,瀏覽器往往都提供了對DOM操作的API,可以用面向?qū)ο蟮姆绞絹聿僮鱀OM扇救。

2. XPath****

http://www.w3school.com.cn/xpath/index.asp 中文教程

XPath 是一門在 XML 文檔中查找信息的語言刑枝。XPath 可用來在 XML 文檔中對元素和屬性進(jìn)行遍歷。

工具
XMLQuire win7+需要.NET框架4.0-4.5迅腔。
測試XML装畅、XPath

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
   <book id="bk101">
      <author>Gambardella, Matthew</author>
      <title>XML Developer's Guide</title>
      <genre>Computer</genre>
      <price>44.95</price>
      <publish_date>2000-10-01</publish_date>
      <description>An in-depth look at creating applications 
      with XML.</description>
   </book>
   <book id="bk102">
      <author>Ralls, Kim</author>
      <title>Midnight Rain</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2000-12-16</publish_date>
      <description>A former architect battles corporate zombies, 
      an evil sorceress, and her own childhood to become queen 
      of the world.</description>
   </book>
   <book id="bk104">
      <author>Corets, Eva</author>
      <title>Oberon's Legacy</title>
      <genre>Fantasy</genre>
      <price>5.95</price>
      <publish_date>2001-03-10</publish_date>
      <description>In post-apocalypse England, the mysterious 
      agent known only as Oberon helps to create a new life 
      for the inhabitants of London. Sequel to Maeve 
      Ascendant.</description>
   </book>
</bookstore>

在 XPath 中,有七種類型的節(jié)點(diǎn):元素沧烈、屬性掠兄、文本、命名空間掺出、處理指令徽千、注釋以及文檔(根)節(jié)點(diǎn)。

/ 根結(jié)點(diǎn)
元素節(jié)點(diǎn)汤锨,例如 book,title等
屬性節(jié)點(diǎn) : id=
Corets, Eva 元素節(jié)點(diǎn)双抽,
id="bk104" 是屬性節(jié)點(diǎn),id是元素節(jié)點(diǎn)book的屬性

節(jié)點(diǎn)之間的嵌套形成父子(parent闲礼、children) 關(guān)系牍汹。
具有同一個父節(jié)點(diǎn)的不同節(jié)點(diǎn)是兄弟(sibling) 關(guān)系

謂語(Predicates)
謂語用來查找某個特定的節(jié)點(diǎn)或者包含某個指定的值的節(jié)點(diǎn)柬泽。
謂語被嵌在方括號中[]慎菲。謂語就是查詢的條件。

操作符或表達(dá)式 含義
/ 從根節(jié)點(diǎn)開始找
// 從當(dāng)前節(jié)點(diǎn)開始的任意層找
. 當(dāng)前節(jié)點(diǎn)
.. 當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
@ 選擇屬性
節(jié)點(diǎn)名 選取所有這個節(jié)點(diǎn)名的節(jié)點(diǎn)
* 匹配任意元素節(jié)點(diǎn)
@* 匹配任意屬性節(jié)點(diǎn)
node() 匹配任意類型的節(jié)點(diǎn)
text() 匹配text類型節(jié)點(diǎn)

XPath 軸(Axes)

軸名稱 結(jié)果
ancestor 選取當(dāng)前節(jié)點(diǎn)的所有先輩(父锨并、祖父等)
ancestor-or-self 選取當(dāng)前節(jié)點(diǎn)的所有先輩(父露该、祖父等)以及當(dāng)前節(jié)點(diǎn)本身
attribute 選取當(dāng)前節(jié)點(diǎn)的所有屬性。@id 等價于 attribute::id
child 選取當(dāng)前節(jié)點(diǎn)的所有子元素第煮。title 等價于 child:title
descendant 選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子解幼、孫等)
descendant-or-self 選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子抑党、孫等)以及當(dāng)前節(jié)點(diǎn)本身
following 選取文檔中當(dāng)前節(jié)點(diǎn)的結(jié)束標(biāo)簽之后的所有節(jié)點(diǎn)
namespace 選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn)
parent 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)
preceding 直到所有這個節(jié)點(diǎn)的父輩節(jié)點(diǎn),順序選擇每個父輩節(jié)點(diǎn)前的所有同級節(jié)點(diǎn)
preceding-sibling 選取當(dāng)前節(jié)點(diǎn)之前的所有同級節(jié)點(diǎn)
self 選取當(dāng)前節(jié)點(diǎn)撵摆。 等價于 self::node()
根bookstore下任意層 title或price

雙擊大綱變?yōu)?當(dāng)前節(jié)點(diǎn)
XPATH實(shí)例

以斜杠開始的稱為絕對路徑底靠,表示從根開始;
不以斜桿開始的稱為相對路徑特铝,一般都是依照當(dāng)前節(jié)點(diǎn)來計(jì)算暑中;當(dāng)前節(jié)點(diǎn)在上下文環(huán)境中,當(dāng)前節(jié)點(diǎn)很可能已經(jīng)不是跟節(jié)點(diǎn)了鲫剿;

一般為了方便鳄逾,往往XML如果層次很深,都會使用//來查找節(jié)點(diǎn)牵素;

路徑表達(dá)式 含義
title 選取當(dāng)前節(jié)點(diǎn)下所有title子節(jié)點(diǎn)
/book 從根結(jié)點(diǎn)找子節(jié)點(diǎn)是book的严衬,找不到
book/title 當(dāng)前節(jié)點(diǎn)下所有子節(jié)點(diǎn)book下的title節(jié)點(diǎn)
//title 從根節(jié)點(diǎn)向下找任意層中title的節(jié)點(diǎn)
book//title 當(dāng)前節(jié)點(diǎn)下所有book子節(jié)點(diǎn)下任意層次的title節(jié)點(diǎn)
//@name 任意層下含有name的 屬性,取回的是屬性
//book[@id] 任意層下含有name屬性的book節(jié)點(diǎn)
//book[@id="bk101"] 任意層下含有name屬性且等于'bk101'的book節(jié)點(diǎn)
/bookstore/book[1] 根節(jié)點(diǎn)bookstore下第一個book節(jié)點(diǎn)笆呆,從1開始
/bookstore/book[1]/@id 根節(jié)點(diǎn)bookstore下第一個book節(jié)點(diǎn)的id屬性
/bookstore/book[last()-1] 根節(jié)點(diǎn)bookstore下倒數(shù)第二個book節(jié)點(diǎn)请琳,函數(shù)last()
/bookstore/* 匹配根節(jié)點(diǎn)bookstore的所有子節(jié)點(diǎn), 不遞歸
//* 匹配所有子孫節(jié)點(diǎn)
//[@] 匹配所有有屬性的節(jié)點(diǎn)
//book[@*] 匹配所有有屬性的book節(jié)點(diǎn)
//@* 匹配所有屬性
//book/title | //pric 匹配book下的title節(jié)點(diǎn)或者任意層下的price
//book[position()=2] 匹配book節(jié)點(diǎn)赠幕,取第二個
//book[position()<last()-1] 匹配book節(jié)點(diǎn)俄精,取位置小于倒數(shù)第二個
//book[price>40] 匹配price節(jié)點(diǎn)值大于40的book節(jié)點(diǎn)
//book[2]/node() = * 匹配位置為2的book節(jié)點(diǎn)下的所有類型的節(jié)點(diǎn)
//book[1]/text() 匹配第一個book節(jié)點(diǎn)下的所有文本子節(jié)點(diǎn)
//book[1]//text() 匹配第一個book節(jié)點(diǎn)下的所有文本節(jié)點(diǎn)
//*[local-name()='book'] 匹配所有節(jié)點(diǎn)且不帶限定名的節(jié)點(diǎn)名稱為book的所有節(jié)點(diǎn)
//book/child::node()
[local-name()='price' and text()<10
]
所有book節(jié)點(diǎn)的子節(jié)點(diǎn)中名字叫做price的且其內(nèi)容小于10的節(jié)點(diǎn),等價于
//book/price[text()<10]
等價式 //book[price<6]/price
//book/price[text()<6]
//book/child::node()[local-name()='price' and text()<6]
這三種等價
//book//*[self::title or self::price] 所有book節(jié)點(diǎn)下子孫節(jié)點(diǎn)榕堰,這些節(jié)點(diǎn)是title或者price竖慧,等價于//book//title |
//book/price,也等價于//book//*[local-name()='title' or local-name()='price']
//*[@class] 所有有class屬性的節(jié)點(diǎn)
//*[@class="bookinfo even"] 所有屬性為"bookinfo even"的節(jié)點(diǎn)
//*[contains(@class,'even')] 屬性class中包含even字符串的節(jié)點(diǎn)
//*[contains(local-name(),'book')] 標(biāo)簽名包含book的節(jié)點(diǎn)
3. lxml

lxml 是Python下功能豐富的XML逆屡、HTML解析庫圾旨, 性能非常好, 是對libxml 2和libxslt的封裝魏蔗。
最新版支持Python 2.6+砍的, python 3支持到3.6。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末莺治,一起剝皮案震驚了整個濱河市廓鞠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谣旁,老刑警劉巖床佳,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異榄审,居然都是意外死亡砌们,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怨绣,“玉大人角溃,你說我怎么就攤上這事拷获±撼牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵匆瓜,是天一觀的道長赢笨。 經(jīng)常有香客問我,道長驮吱,這世上最難降的妖魔是什么茧妒? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮左冬,結(jié)果婚禮上桐筏,老公的妹妹穿的比我還像新娘。我一直安慰自己拇砰,他們只是感情好梅忌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著除破,像睡著了一般牧氮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瑰枫,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天踱葛,我揣著相機(jī)與錄音,去河邊找鬼光坝。 笑死尸诽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盯另。 我是一名探鬼主播性含,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼土铺!你這毒婦竟也來了胶滋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤悲敷,失蹤者是張志新(化名)和其女友劉穎究恤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體后德,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡部宿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片理张。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡赫蛇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雾叭,到底是詐尸還是另有隱情悟耘,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布织狐,位于F島的核電站暂幼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏移迫。R本人自食惡果不足惜旺嬉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厨埋。 院中可真熱鬧邪媳,春花似錦、人聲如沸荡陷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亲善。三九已至设易,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛹头,已是汗流浹背顿肺。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留渣蜗,地道東北人屠尊。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像耕拷,于是被迫代替她去往敵國和親讼昆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348