xpath语法与lxml库

Posted vinson-cheung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xpath语法与lxml库相关的知识,希望对你有一定的参考价值。

1.什么是XPath

  • 一种在XML和html文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历

2.节点

  • 节点类型

    在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。其中,XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

    比如说:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <bookstore>  #文档节点
    <book>
        <title lang="en">Harry Potter</title>   #lang="en"属性节点
        <author>J K. Rowling</author>   #元素节点
        <year>2005</year>
        <price>29.99</price>
    </book>
    </bookstore>
    
  • 基本值(原子值)

    基本只是无父或无子的节点

    JJ K. Rowling
    "en"
    
  • 节点关系

    ①父:每个元素及属性都有一个父

    ②子:元素节点可有零个、一个、多个子

    ③同胞:拥有相同的父的节点

    ④先辈:某节点的父、父的父

    ⑤后代:某个节点的子、子的子,等等

3.语法

  • 选取节点

    表达式 描述
    nodename(节点名) 选取此节点的所有子节点
    / 从根节点选取
    // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
    . 选取当前节点,比如说 ‘.//a‘ 就是获取某一个节点下的a标签,而不是整个文档中的a标签
    .. 选取当前节点的父节点
    @ 选取属性
  • 谓语

    谓语是用来查找某个特定的节点或者包含某个指定的值的节点

    路径表达式 结果
    /bookstore/book[1] 选取 bookstore 子元素的第一个 book 元素
    /bookstore/book[last()] 选取 bookstore 子元素的最后一个 book 元素
    /bookstore/book[last()-1] 选取 bookstore 子元素的倒数第二个 book 元素
    /bookstore/book[position()<2] 选取第一个 bookstore 的子元素 book 元素
    //title[@lang] 选取有 lang 属性的 title 元素
    //title[@lang=‘eng‘] 选取有值为 eng 的 lang 属性的 title 元素
    /bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00
  • 选取未知节点
    通配符 描述 例子
    * 匹配任何元素节点 /bookstore/*,选取bookstore的所有子元素
    @* 匹配任何属性节点 //title[@*],选取所有带有属性的title元素

3.运算符

技术图片

4.lxml库

  • lxml是一个HTML/XML的解析器,主要功能是解析+提取HTML/XML数据

5.基本使用

  • 解析html字符串:

    from lxml import etree #使用lxml的etree
    
    url = ‘www.baidu.com‘
    
    resp = requests.get(url) #获取HTML网页信息
    text = resp.text #获取一个 unicode 型的文本数据(字符串)
    html = etree.HTML(text) #利用etree.HTML,将字符串解析为HTML文档
    

    注:在使用lxml来解析HTML代码的时候,如果HTML代码不规范,它会自动补全。

    注:上述定义的html并不是一个字符串,而是一个对象

  • 解析html文件:

    在使用 ‘lxml.etree.parse‘ 进行解析时,这个函数默认使用的是 ‘XML‘ 解析器,所以遇到不规范的html代码时会解析错误,这时候要自己指定 ‘HTML‘ 解析器。

    parser = etree.HTMLParser(encoding=‘utf-8‘)
    html = etree.parse(‘文件.html‘,parser=parser)
    print(etree.tostring(html, encoding=‘utf-8‘).decode(‘utf-8‘)) #将Element对象转换成字符串输出
    
  • 与xpath结合

    ①获取一个html对象中所有的tr标签

    trs = html.xpath(‘//tr‘) # ‘.xpath‘ 返回的是一个list
    for tr in trs:
        print(etree.tostring(tr, encoding=‘utf-8‘).decode(‘utf-8‘)) #将Element转换成str输出
    

    ②获取第二个tr标签

    tr = html.xpath(‘//tr‘)[0] #因为 ‘.xpath‘ 返回的是列表,所以获取第一个元素需要加[0]
    

    ③获取所有class等于even的tr标签

    trs = html.xpath(‘//tr[@class=‘even‘]‘)
    for tr in trs:
        print(etree.tostring(tr, encoding=‘utf-8‘).decode(‘utf-8‘))
    

    ④获取所有a标签的href属性的值

    datas = html.xpath(‘//a/@href‘)
    for data in datas:
        print(data) #该例href的值已经是一个str类型,所以不用再使用 ‘.tostring‘ 方法
    

    ⑤获取文本信息

    data = tr.xpath(‘./td[3]/text()‘)[0] #xpath返回的永远是list,不要忘记加[0]
    

    注:如果文本信息不是直接在td标签下的话,就要 ‘//text()‘

以上是关于xpath语法与lxml库的主要内容,如果未能解决你的问题,请参考以下文章

Xpath语法与lxml库的用法

Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法

Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法

Python爬虫利器三之Xpath语法与lxml库的用法

Python爬虫利器三之Xpath语法与lxml库的用法

Python爬虫基础——XPath语法的学习与lxml模块的使用