• Python爬虫——XPath解析本地html文件


    Python爬虫——XPath解析本地html文件

    1、XPath 简介

    XPath:XML路径语言(XML Path Language),XPath作用是确定XML文档中某部分的位置,同时它也可以用于检索 HTML 文件。在使用爬虫过程中可以用 XPath 来爬取网页中想要的数据。

    Xpath 可以理解为在 XML/HTML 文档中对元素和属性进行遍历的工具。

    Xpath 使用简洁的路径表达式来匹配 XML/HTML 文档中的节点或者节点集,通过定位网页中的节点,从而找到我们需要的数据。

    Xpath 提供了100 多个内建函数,包括了处理字符串、数值、日期以及时间的函数。因此 Xpath 路径表达式几乎可以匹配所有的元素节点。

    Xpath 路径表达式跟电脑文件夹目录、网址的url相似,用 / 来表示路径的深度。

    XPath插件的下载安装

    chrome插件XPATH HelPer 下载地址:

    链接:https://pan.baidu.com/s/1cx5Q42aJs1mky1qSZQYObA?pwd=sesp

    提取码:sesp

    下载XPATH HelPer插件,把下载文件的后缀名改为.zip;

    打开谷歌浏览器,进入扩展程序,打开开发者模式,把XPATH HelPer插件拉进扩展程序界面,自动进行安装:

    在这里插入图片描述

    打开XPATH HelPer插件快捷键:CTRL+SHIFT+X,

    打开后浏览器上方会出现使用 XPATH 插件的窗口:

    在这里插入图片描述

    2、下载 lxml

    第三方解析库 lxml是一款高性能的 Python HTML/XML 解析器, 对 Xpath 路径表达式提供了良好的支持,主要的功能是利用XPath语法解析和提取 HTML/XML 数据。

    1、lxml安装位置:Python安装目录的Scripts文件夹下

    2、安装命令:pip install lxml -i https://pypi.douban.com/simple,如下图则安装成功:

    在这里插入图片描述

    3、XPath解析本地 html 文件

    XPath路径表达式:

    表达式描述
    node_name(节点名)选取此节点的所有子节点
    /查找当前节点的子节点
    //查找当前节点的所有子孙节点,不考虑层级关系
    .选取当前节点
    选取当前节点的父节点
    @选取属性值,通过属性值选取数据。常用元素属性有 @id 、@name、@value、@type、@class、@tittle、@href

    编写本地html文件:xpath_local.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>Titletitle>
    head>
    <body>
        <ul>
            <li id="name" class="bookName">法治的细节li>
            <li id="model">纸质书li>
            <li class="price">30元li>
            <li class="author">罗翔li>
        ul>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    路径查询:

    解析实例:查找 ul 标签下的 li 标签

    from lxml import etree
    #解析本地文件使用 etree.parse
    tree = etree.parse('xpath_local.html')
    
    list1 = tree.xpath('//body/ul/li')
    #返回标签内容 text()
    list2 = tree.xpath('//body/ul/li/text()')
    list3 = tree.xpath('//body//li/text()')
    print(list1)
    print(list2)
    print(list3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    执行结果:

    [, , , ]
    ['法治的细节', '纸质书', '30元', '罗翔']
    ['法治的细节', '纸质书', '30元', '罗翔']
    
    • 1
    • 2
    • 3

    谓词查询:

    解析实例:查找有id属性的li标签

    from lxml import etree
    
    tree = etree.parse('xpath_local.html')
    
    list1 = tree.xpath('//body/ul/li[@id]/text()')
    print(list1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    ['法治的细节', '纸质书']
    
    • 1

    属性查询:

    解析实例:查找id属性为"name"的li标签

    from lxml import etree
    
    tree = etree.parse('xpath_local.html')
    
    list1 = tree.xpath('//body/ul/li[@id="name"]/text()')
    print(list1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    ['法治的细节']
    
    • 1

    解析实例:查找id为"name"的 li 标签的class属性的数据

    from lxml import etree
    
    tree = etree.parse('xpath_local.html')
    
    list1 = tree.xpath('//body/ul/li[@id="name"]/@class')
    print(list1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    ['bookName']
    
    • 1

    模糊查询:

    解析实例:查找id属性值包含"a"的 li 标签

    from lxml import etree
    
    tree = etree.parse('xpath_local.html')
    
    list1 = tree.xpath('//ul/li[contains(@id,"a")]/text()')
    print(list1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    ['法治的细节']
    
    • 1

    解析实例:查找id属性值以"m"为开头的 li 标签

    from lxml import etree
    
    tree = etree.parse('xpath_local.html')
    
    list1 = tree.xpath('//ul/li[starts-with(@id,"m")]/text()')
    print(list1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    执行结果:

    ['纸质书']
    
    • 1
  • 相关阅读:
    Java基础-异常处理
    Kafka系列之:NoBrokersAvailable和Failed to update metadata after 60.0 secs.
    字符串常用方法,想要的这儿都有
    【JAVA】优先级队列(堆)
    初始Pandas -> 数据缺失值处理
    布隆过滤器
    vivado Versal 串行 I/O 硬件调试流程、使用 Vivado Serial I/O Analyzer 来调试设计
    秋招每日一题T10——峰会
    【haproxy】haproxy七层代理
    Java项目:JSP酒店管理系统
  • 原文地址:https://blog.csdn.net/wpc2018/article/details/125989846