人们对于不确定之事的兴趣,永远多于已经确定之事,过去和现在经常被人们遗忘。所以,能够编织梦想的人,永远是最受欢迎之人!

总结:
- HTML与XML的差别
HTML是用来做数据格式的显示的,里面的数据是为了用标签在浏览器中绘制出来的;
XML的创造是为了在系统之间传输数据,树形结构、标签;费流量;可以用JSON- XML中,<> 内的用来存放属性\类 ; 用条件 @ 来匹配; [] 内些匹配条件
- node() \ local-name() \ 函数返回 为节点
1. HTML解析
HTML的内容返回给浏览器,浏览器就会解析它,并对它渲染。
HTML 超文本表示语言,设计的初衷就是为了超越普通文本,让文本表现力更强。
XML扩展标记语言,不是为了代替HTML,而是觉得HTML的设计中包含了过多的格式,承担了一部分数据之外的
任务,所以才设计了XML只用来描述数据。
HTML和XML都有结构,使用标记形成树型的嵌套结构。DOM(Document Object Model)来解析这种嵌套树型
结构,浏览器往往都提供了对DOM操作的API,可以用面向对象的方式来操作DOM。
2. XPath****
http://www.w3school.com.cn/xpath/index.asp 中文教程
XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。
工具
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 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
/ 根结点
元素节点,例如 book,title等
属性节点 : id=
Corets, Eva 元素节点,
id="bk104" 是属性节点,id是元素节点book的属性
节点之间的嵌套形成父子(parent、children) 关系。
具有同一个父节点的不同节点是兄弟(sibling) 关系。
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中[]。谓语就是查询的条件。
操作符或表达式 | 含义 |
---|---|
/ | 从根节点开始找 |
// | 从当前节点开始的任意层找 |
. | 当前节点 |
.. | 当前节点的父节点 |
@ | 选择属性 |
节点名 | 选取所有这个节点名的节点 |
* | 匹配任意元素节点 |
@* | 匹配任意属性节点 |
node() | 匹配任意类型的节点 |
text() | 匹配text类型节点 |
XPath 轴(Axes)
轴名称 | 结果 |
---|---|
ancestor | 选取当前节点的所有先辈(父、祖父等) |
ancestor-or-self | 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 |
attribute | 选取当前节点的所有属性。@id 等价于 attribute::id |
child | 选取当前节点的所有子元素。title 等价于 child:title |
descendant | 选取当前节点的所有后代元素(子、孙等) |
descendant-or-self | 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 |
following | 选取文档中当前节点的结束标签之后的所有节点 |
namespace | 选取当前节点的所有命名空间节点 |
parent | 选取当前节点的父节点 |
preceding | 直到所有这个节点的父辈节点,顺序选择每个父辈节点前的所有同级节点 |
preceding-sibling | 选取当前节点之前的所有同级节点 |
self | 选取当前节点。 等价于 self::node() |


XPATH实例
以斜杠开始的称为绝对路径,表示从根开始;
不以斜杆开始的称为相对路径,一般都是依照当前节点来计算;当前节点在上下文环境中,当前节点很可能已经不是跟节点了;
一般为了方便,往往XML如果层次很深,都会使用//来查找节点;
路径表达式 | 含义 |
---|---|
title | 选取当前节点下所有title子节点 |
/book | 从根结点找子节点是book的,找不到 |
book/title | 当前节点下所有子节点book下的title节点 |
//title | 从根节点向下找任意层中title的节点 |
book//title | 当前节点下所有book子节点下任意层次的title节点 |
//@name | 任意层下含有name的 属性,取回的是属性 |
//book[@id] | 任意层下含有name属性的book节点 |
//book[@id="bk101"] | 任意层下含有name属性且等于'bk101'的book节点 |
/bookstore/book[1] | 根节点bookstore下第一个book节点,从1开始 |
/bookstore/book[1]/@id | 根节点bookstore下第一个book节点的id属性 |
/bookstore/book[last()-1] | 根节点bookstore下倒数第二个book节点,函数last() |
/bookstore/* | 匹配根节点bookstore的所有子节点, 不递归 |
//* | 匹配所有子孙节点 |
//[@] | 匹配所有有属性的节点 |
//book[@*] | 匹配所有有属性的book节点 |
//@* | 匹配所有属性 |
//book/title | //pric | 匹配book下的title节点或者任意层下的price |
//book[position()=2] | 匹配book节点,取第二个 |
//book[position()<last()-1] | 匹配book节点,取位置小于倒数第二个 |
//book[price>40] | 匹配price节点值大于40的book节点 |
//book[2]/node() = * | 匹配位置为2的book节点下的所有类型的节点 |
//book[1]/text() | 匹配第一个book节点下的所有文本子节点 |
//book[1]//text() | 匹配第一个book节点下的所有文本节点 |
//*[local-name()='book'] | 匹配所有节点且不带限定名的节点名称为book的所有节点 |
//book/child::node() [local-name()='price' and text()<10] |
所有book节点的子节点中名字叫做price的且其内容小于10的节点,等价于 //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节点下子孙节点,这些节点是title或者price,等价于//book//title | //book/price,也等价于//book//*[local-name()='title' or local-name()='price'] |
//*[@class] | 所有有class属性的节点 |
//*[@class="bookinfo even"] | 所有属性为"bookinfo even"的节点 |
//*[contains(@class,'even')] | 属性class中包含even字符串的节点 |
//*[contains(local-name(),'book')] | 标签名包含book的节点 |
3. lxml
lxml 是Python下功能丰富的XML、HTML解析库, 性能非常好, 是对libxml 2和libxslt的封装。
最新版支持Python 2.6+, python 3支持到3.6。
网友评论