人們對于不確定之事的興趣,永遠(yuǎn)多于已經(jīng)確定之事骤竹,過去和現(xiàn)在經(jīng)常被人們遺忘尿贫。所以,能夠編織夢想的人蒂阱,永遠(yuǎn)是最受歡迎之人!
總結(jié):
- HTML與XML的差別
HTML是用來做數(shù)據(jù)格式的顯示的锻全,里面的數(shù)據(jù)是為了用標(biāo)簽在瀏覽器中繪制出來的;
XML的創(chuàng)造是為了在系統(tǒng)之間傳輸數(shù)據(jù)蒜危,樹形結(jié)構(gòu)虱痕、標(biāo)簽;費(fèi)流量;可以用JSON- XML中辐赞,<> 內(nèi)的用來存放屬性\類 ; 用條件 @ 來匹配硝训; [] 內(nèi)些匹配條件
- 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() |
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。