Xpath
XPath,全称XML Path Language,即XML 路径语言,它是一门在XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于HTML 文档的搜索,所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。
Xpath术语
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
以上 XML 文档中:
<bookstore> (这是一个“根节点或者文档节点”)
<author>J K. Rowling</author> (这是一个“元素”)
lang="en" (这是一个“属性”)
换个视角理解它:
- bookstore (我是根)
- book (我是元素)
- title (我是元素)
- lang = en (我是属性)
- text = Harry Potter (我是文本)
- author (我是元素)
- text = J K. Rowling (我是文本)
- year (我是元素)
- text = 2005 (我是文本)
- price (我是元素)
- text = 29.99 (我是文本)
节点之间的关系
-
父(parent)
- 每个元素都肯定有一个父节点,最顶层的元素父亲是根节点。同理每个属性必然有一个父,它们的父是元素。
上文 XML 文档中,根 bookstore 是元素 book 的父节点,book 是元素 title, author, year, price 的父节点,title 是 lang 的父节点。
- 每个元素都肯定有一个父节点,最顶层的元素父亲是根节点。同理每个属性必然有一个父,它们的父是元素。
-
子(children)
- 元素可以有零或多个子,上文 XML 文档中,title, author, year, price 是 book 的子节点
-
同胞(sibling)
- 父节点相同的节点之间互为同胞,也称彼此的兄弟节点,上文 XML 文档中,title, author, year, price 彼此互为同胞
-
先辈(Ancestor)
- 某节点的父节点、父的父,以此类推一直追溯至根节点之间所有节点,上文 XML 文档中,title, author, year, price 的先辈就是 book, bookstore
-
后代(Descendant)
- 某节点的子节点、子的子,以此类推至最后一个子节点之间所有节点,上文 XML 文档中,bookstore 的后代就是book, title, author, year, price
Xpath语法
- nodename 选取节点的所有子节点(//div)
- / 从根节点选取 (/div)
- // 选取所有的当前节点,不考虑他们的位置(//div)
- . 选取当前节点(./div)
- .. 选取当前节点的父节点(../div)
- @ 选取属性 (/div[@class='class1'], /a/@href)
谓词:被嵌方括号内,用来查找某个特定的节点或者包含某个指定的值的节点
- /body/ div[1] (选取body下第一个div的节点)
- /body/div[last()](选取body下面倒数第二个div节点)
- /body/div[last()-1](选取body下面倒数第二个div节点)
- /body/div[@class="class1"] (选取body下class属性为class1的div节点)
通配符:Xpath通过通配符来选取位置的XML元素
- /div/* (选取div下的所有子节点)
- /div[@*]/ (选取所有带属性的div节点)
取多个路径:使用 | 运算符可以选取多个路径
- //div | //table (选取所有的div和table节点)
定位相邻元素
- //div/a/preceding-sibling::span 定位div下a节点前一位相邻兄弟span节点
- //div/a/following-sibling::span 定位div下a节点后一位相邻兄弟span节点
- //div/a/preceding-sibling::span[n] 定位div下a节点前n位兄弟span节点
- //div/a/following-sibling::span[n] 定位div下a节点后n位兄弟span节点
实例,新浪http://news.163.com/special/0001386F/rank_news.html