2020-06-11

Xpath

XPath,全称XML Path Language,即XML 路径语言,它是一门在XML 文档中查找信息的语言。最初是用来搜寻 XML 文档的,但同样适用于HTML 文档的搜索,所以在做爬虫时完全可以使用 XPath 做相应的信息抽取。

Xpath术语

在 XPath 中,有七种类型的节点:元素属性文本、命名空间、处理指令、注释以及文档(根)节点


  
    Harry Potter
    J K. Rowling 
    2005
    29.99
  


以上 XML 文档中:

 (这是一个“根节点或者文档节点”)
J K. Rowling (这是一个“元素”)
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

你可能感兴趣的:(2020-06-11)