• 【python】爬虫系列之lxml库介绍和xpath提取网页数据


    目录

    一、爬虫提取网页数据的流程

     二、 lxml库介绍

    2.1 下载安装lxml库

      2.2 解析HTML网页

    三、xpath介绍

    1. 选取节点

    2. 谓语

    3. 选取未知节点

    4. 选取若干路径


    活动地址:CSDN21天学习挑战赛

    **

    学习日记 Day16

    **

    一、爬虫提取网页数据的流程

    获取到html字符串,经过lxml库解析,变成HTML页面,再通过xpath的提取可以获取到需要的数据。

     二、 lxml库介绍

    lxml看是xml和html的解析器,主要功能是解析xml和html中的数据;lxml是一款高性能的python html、xml解析器,也可以利用xpath语法,来定位特定的元素即节点信息。

    2.1 下载安装lxml库

    使用命令 【pip install lxml】下载安装lxml库。

      2.2 解析HTML网页

    解析HTML网页用到了lxml库中的etree类。

    示例1:解析HTML字符串

    1. from lxml import etree
    2. text = '''
    3. CSDN
    4. python
    5. lxml解析HTML
  • '''
  • # 初始化,传入一个html形式的字符串
  • html = etree.HTML(text)
  • print(html)
  • print(type(html))
  • # 将字符串序列化为html字符串
  • result = etree.tostring(html).decode('utf-8')
  • print(result)
  • print(type(result))
  • 输出结果:

    1. <Element html at 0x1c9ba29e880>
    2. <class 'lxml.etree._Element'>
    3. <html><body>
    4. <div class="key">
    5. <div class="Websit">CSDNdiv>
    6. <div class="Lang">pythondiv>
    7. <div class="Content">lxmlHTMLdiv>
    8. div>
    9. body>html>
    10. <class 'str'>

    示例2:读取并解析HTML文件

    1. from lxml import etree
    2. # 初始化,传入一个html形式的字符串
    3. html = etree.parse('test.html')
    4. # 将字符串序列化为html字符串
    5. result = etree.tostring(html).decode('utf-8')
    6. print(result)
    7. print(type(result))
    8. html=etree.HTML(result)
    9. print(html)
    10. print(type)

    显示结果:

    1. <html><body>
    2. <div class="key">
    3. <div class="Website">CSDNdiv>
    4. <div class="Lang">pythondiv>
    5. <div class="Content">lxmlHTMLdiv>
    6. div>
    7. body>html>
    8. <class 'str'>
    9. <Element html at 0x19f271bf4c0>
    10. <class 'type'>

    总结:

    如果有一个html的字符串,可以使用etree.HTML(html_str)函数初始化为html,然后使用etree.tostring(html).decode('utf-8')序列化为html字符串;

    如果html内容被存储到文件中,那么可以使用etree.parse(filename)解析文件,然后使用etree.tostring(html).decode('utf-8')序列化为html字符串。

    三、xpath介绍

    xpath是在xml文档中查找信息的语言,可用来在xml文档中对元素和属性进行遍历。

    1. 选取节点

    常用的路径表达式有:

    表达式说明
    nodename选取此节点的所有子节点
    /从根节点选取
    //从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
    .选取当前节点
    ..选取当前节点的父节点
    @选取属性

    示例:

    表达式说明
    bookstore选取bookstore元素的所有子节点
    /bookstore选取根元素bookstore。注释:假如路径起始于正斜杠/,此路径始终代表到某元素的绝对路径!
    bookstore/book选取属于bookstore的子元素的所有book元素
    //book选取所有book子元素,不管它们在文档中的位置
    bookstore//book选择属于bookstore元素的后代的所有book元素,不管它们位于bookstore之下的什么位置
    //@lang选取名为lang的所有属性

    2. 谓语

    谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。

    路径表达式说明
    /bookstore/bok[1]选取属于bookstore子元素的第一个book元素
    /bookstore/book[last()]选取属于bookstore子元素的最后一个book元素
    /bookstore/book[last()-1]选取属于bookstore子元素的倒数第二个book元素
    /bookstore/book[position()<3]选取属于bookstore子元素的最前面的两个book元素
    //title[@lang]选取所有拥有名为lang的属性的title元素
    //title[@lang='eng']选取所有title元素,且这些元素拥有值为eng的lang属性
    /bookstore/book[price>35.00]选取bookstore元素的所有book元素,且其中的price元素的值必须大于35.00
    /bookstore/book[price>35.00]/title选取bookstore元素中的book元素的所有title元素,且其中的price元素的值须大于35.00

    3. 选取未知节点

    xpath通配符可以用来选取未知的xml元素。

    通配符说明
    *匹配任何元素节点
    @*匹配任何属性节点
    node()匹配任何类型的节点

    示例:

    路径表达式说明
    /bookstore/*读取bookstore元素的所有子元素
    //*选取文档中的所有元素
    html/node()/meta/@*选取html下面任意节点下的meta节点的所有属性
    //title[@*]选取所有带有属性的title元素

    4. 选取若干路径

    通过在路径表达式中使用|运算符,可以选取若干个路径。

    示例:

    路径表达式结果
    //book/title | //book/price选取book元素的所有title和price元素
    //title | //price选取文档中的所有title和price元素
    /bookstore/book/title | //price选取属于bookstore元素的book元素的所有title元素,以及文档中所有的price元素

    xpath使用示例:

    新建test.html文件:

    1. <div>
    2. <ul>
    3. <li class="item-0"><a href="link1.html">first itema>li>
    4. <li class="item-1"><a href="link2.html">second itema>li>
    5. <li class="item-inactive"><a href="link3.html"><span class="bold">third itemspan>a>li>
    6. <li class="item-1"><a href="link4.html">fourth itema>li>
    7. <li class="item-0"><a href="link5.html">fifth itema>li>
    8. ul>
    9. div>

    ⚪ 获取所有的

  • 标签

    1. # 获取所有的
    2. 标签
  • from lxml import etree
  • html = etree.parse('test.html')
  • print(type(html))
  • result = html.xpath('//li')
  • print(result)
  • print(len(result))
  • print(type(result))
  • print(type(result[0]))
  • 显示结果:

    1. <class 'lxml.etree._ElementTree'>
    2. [<Element li at 0x21eca60ad80>, <Element li at 0x21eca60ae40>, <Element li at 0x21eca60ae80>, <Element li at 0x21eca60aec0>, <Element li at 0x21eca60af00>]
    3. 5
    4. <class 'list'>
    5. <class 'lxml.etree._Element'>

    ⚪ 获取

  • 标签的所有class属性

    1. # 获取
    2. 标签的所有class属性
  • from lxml import etree
  • html = etree.parse('test.html')
  • result = html.xpath('//li/@class')
  • print(result)
  • print(len(result))
  • print(type(result))
  • print(type(result[0]))
  • 显示结果:

    1. ['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
    2. 5
    3. <class 'list'>
    4. <class 'lxml.etree._ElementUnicodeResult'>

    ⚪ 获取

  • 标签下href为link1.html的标签

    1. # 获取
    2. 标签的所有class属性
    3. from lxml import etree
    4. html = etree.parse('test.html')
    5. result = html.xpath('//li/a[@href="link1.html"]')
    6. print(result)
    7. print(len(result))
    8. print(type(result))
    9. print(type(result[0]))

    显示结果

    1. [0x141b529f380>]
    2. 1
    3. <class 'list'>
    4. <class 'lxml.etree._Element'>

    ⚪ 获取

  • 标签下的所有标签

    1. # 获取
    2. 标签的所有class属性
    3. from lxml import etree
    4. html = etree.parse('test.html')
    5. result = html.xpath('//li//span')
    6. print(result)

    显示结果:

    1. [<Element span at 0x1da409cf480>]
    2. 1

    ⚪ 获取

  • 标签下的标签里的所有class

    1. # 获取
    2. 标签的所有class属性
    3. from lxml import etree
    4. html = etree.parse('test.html')
    5. result = html.xpath('//li/a//@class')
    6. print(result)
    7. print(len(result))

    显示结果:

    1. ['bold']
    2. 1

    ⚪ 获取最后一个

  • 的href

    1. # 获取
    2. 标签的所有class属性
    3. from lxml import etree
    4. html = etree.parse('test.html')
    5. result = html.xpath('//li[last()]/a/@href')
    6. print(result)
    7. print(len(result))

    显示结果:

    1. ['link5.html']
    2. 1

    ⚪ 获取倒数第二个元素的内容

    1. # 获取
    2. 标签的所有class属性
    3. from lxml import etree
    4. html = etree.parse('test.html')
    5. result = html.xpath('//li[last()-1]/a')
    6. print(result)
    7. print(result[0].text)
    8. print(len(result))

    显示结果:

    1. [<Element a at 0x19937dbf300>]
    2. fourth item
    3. 1

    ⚪ 获取class值为bold的标签名

    1. # 获取
    2. 标签的所有class属性
    3. from lxml import etree
    4. html = etree.parse('test.html')
    5. result = html.xpath('//*[@class="bold"]')
    6. print(result)
    7. print(result[0].tag)
    8. print(len(result))

    显示结果:

    1. [<Element span at 0x1ecc377f2c0>]
    2. span
    3. 1

    全文参考:

    100天精通Python(爬虫篇)——第45天:lxml库与Xpath提取网页数据_无 羡ღ的博客-CSDN博客_python爬取网页内容一、爬虫提取网页数据的流程图二、lxml库 1. 下载安装 2. 解析HTML网页三、Xpath介绍 1. 选取节点 2. 谓语 3. 选取未知节点 4. 选取若干路径 5. Chrome插件 XPath Helper安装使用 6. Xpath实战..................https://blog.csdn.net/yuan2019035055/article/details/125583136

  • 相关阅读:
    java计算机毕业设计vue水果商城源码+数据库+系统+lw文档
    2022年测试行业的新变化
    ChatGPT研究论文提示词集合2-【形成假设、设计研究方法】
    06【保姆级】-GO语言的运算符
    云原生Kubernetes:Kubeadm部署K8S单Master架构
    一些 protobuf 的复盘(一)—— C++写完后的验证
    基于DotNetty实现自动发布 - 实现一键打包发布
    Go语言开发(3)变量
    kafka集成flink api编写教程
    想学设计模式、想搞架构设计,先学学 UML 系统建模吧
  • 原文地址:https://blog.csdn.net/sinat_41752325/article/details/126402865