码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 快速入门XPath语法,轻松解析爬虫时的HTML内容


    快速入门XPath语法,轻松解析爬虫时的HTML内容

    爬虫时,很多网站返回的是HTML文件,可以用正则表达式(re库)或XPath语法来匹配目标内容,这两种方法属于爬虫的基本技能,实战中要会灵活运用。
    对于一些结构和内容复杂的HTML,用re匹配会感觉力不从心,XPath可以解决我们的烦恼。
    本文的内容可以帮助你快速入门XPath语法,当需要使用时,对照本文的语法和伪代码,可以快速写出正确的XPath代码,提取到目标内容。
    HTML、XML、XPath简介
    HTML是Hyper Text Markup Language(超文本标记语言)的缩写,我们在浏览器中看到的内容都是HTML代码经过浏览器渲染的结果。
    XML是EXtensible Markup Language(可扩展标记语言)的缩写,XML是一种很类似HTML的标记语言,不过XML的设计宗旨是传输数据,而非显示数据。
    XML的标签我们可以自行定义,具有自我描述性。我们可以根据XML中的标签来获取对应的数据。
    XPath是XML Path Language(XML路径语言)的缩写,是一门在XML文档中查找信息的语言,用来提取XML文档中的元素和属性。
    用XPath语言获取HTML中的内容时,先将HTML转换成XML文档,然后根据XML的树形结构来定位到指定的元素和属性,提取数据。如果有数据结构树的基础知识,理解起来很容易。
    本文只分别用了一句话简短介绍,HTML、XML和树的知识可以自己扩展。
    XPath语法介绍
    XPath使用路径表达式来选取XML文档中的节点或者节点集。

    • 路径表达式:
    	nodename   选取此节点的所有子节点。
        /   从根节点选取。正斜杠也是路径分隔符。
        //  从任意位置选取文档中的节点。
        .   选取当前节点。
        ..  选取当前节点的父节点。
        @   选取当前节点的属性。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
    假如路径起始于正斜杠( / ),则此路径代表到某元素的绝对路径。

    • 通配符:
        *    任意元素。
        @*   任意属性。
        node()  任意子节点(元素,属性,内容)。
    
    • 1
    • 2
    • 3

    XPath的通配符可用来选取未知的XML元素。

    • 谓语:
        //a[n]	n为1开始的整数,选取排在第n个位置的<a>元素。
        //a[last()]	last()表示选取排在最后位置的<a>元素。
        //a[last()-1]	和上面同理,表示选取倒数第二个<a>元素。
        //a[position()<3]	选取第一个和第二个<a>元素。
        //a[@href]	选取拥有href属性的<a>元素。
        //a[@href='www.baidu.com']	选取href属性值为'www.baidu.com'的<a>元素。
        //a[@price>10]	选取price属性值大于10的<a>元素。
        //a[@price>10]/span	 选取price属性值大于10的<a>元素下的<span>元素。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    谓语用来查找某个特定的节点,或包含某个指定值的节点,语法写在元素名后的方括号中,可以写元素的位置编号、函数、用@选取属性等。

    • 选取多个路径:
    //book/title | //book/price	 选取<book>元素的所有<title>和<price>元素。
    //title | //price	 选取所有<title>和<price>元素。
    /bookstore/book/title | //price	 选取属于<bookstore>元素的<book>元素的所有<title>元素,以及所有的<price>元素。
    
    • 1
    • 2
    • 3

    选取多个路径时,使用“|”运算符表示“或”的关系。

    • 运算符:
    + - * div	加减乘除。
    = !=	等于,不等于。
    < <=	小于,小于等于。
    > >=	大于,大于等于。
    or and	 或,与
    mod	  计算余数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    运算符基本都是运用在谓语中,帮助我们选取指定元素。

    • 常用函数:
    contains(@属性,string)	选取属性里包含字符串string的元素。
    text()	 获取元素中的内容。
    last()	 选取最后一个元素。
    position()	用于选取多个元素中某些位置(数字编号)的元素。
    count()	 返回元素的数量。
    max()	返回最大的元素,min(),avg(),sum()同理。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    函数也基本都是运用在谓语中,帮助我们选取指定元素。
    lxml库使用
    lxml是Python中用来解析HTML/XML的第三方库,lxml的主要功能是生成一个解析器,解析和提取HTML/XML中的数据。
    先用lxml生成解析器,然后用XPath语法从解析器中提取HTML/XML中的内容。

    • 安装命令:
    pip install lxml
    
    • 1
    • 实战演练:
    # coding=utf-8
    from lxml import etree
    
    text = '''
    
    
    
        XPath Test
    
    
    
    • first item
    • second item
    • third item
    • first project
    • second project
    '''
    # 利用etree.HTML,将字符串解析为HTML文档 html = etree.HTML(text) # 读取html文件 # html = etree.parse('test.html') print(html) # 按字符串序列化HTML文档 result = etree.tostring(html, pretty_print=True) print(result)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    <Element html at 0x1c3be4c9740>
    b'\n
    \nXPath Test\n\n
    \n
    \n
      \n
    • first item
    • \n
    • second item
    • \n
    • third item
    • \n
    • first project
    • \n
    • second project
    • \n
    \n
    \n\n \n'
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用from lxml import etree从lxml库中导入etree解析器,利用etree.HTML将HTML格式的字符串解析成树状的结构,然后用XPath语法从中提取数据。
    爬虫获取到的HTML内容一般是response.text中返回的,可以用etree.HTML解析,也可以用etree.parse解析本地的HTML文件。
    直接打印etree.HTML或etree.parse解析的结果是一个Element对象,可以用etree.tostring将Element中的内容序列化,打印出来。

    • 用XPath从解析器中提取数据:
    # 获取所有class属性值为'item'的
  • 元素 infos = html.xpath("//li[@class='item']") print(infos)
    • 1
    • 2
    • 3
  • [<Element li at 0x25951272840>, <Element li at 0x25951272780>]
    
    • 1
    # 获取所有class属性中包含'pro'字符串的
  • 元素 infos = html.xpath("//li[contains(@class, 'pro')]") for info in infos: # 获取
  • 元素中元素的文本内容 print(info.xpath("a/text()"))
    • 1
    • 2
    • 3
    • 4
    • 5
  • ['first project']
    ['second project']
    
    • 1
    • 2
    # 获取倒数第二个
  • 元素下的最后一个元素 info = html.xpath("//li[last()-1]/a[last()]") # 打印元素的内容 print(info[0].text)
    • 1
    • 2
    • 3
    • 4
  • first project
    
    • 1
    # 获取前三个
  • 元素下的元素的内容 infos = html.xpath("//li[position()<4]/a/text()") for info in infos: # 打印元素的文本内容 print(info)
    • 1
    • 2
    • 3
    • 4
    • 5
  • first item
    second item
    third item
    
    • 1
    • 2
    • 3

    以上就是本文的全部内容,如果本文可以帮助你快速入门XPath语法,欢迎点赞、收藏、评论,也可以关注和联系我一起交流讨论。

    参考文档:
    [1] XML W3School官方文档:http://www.w3school.com.cn/xml/index.asp
    [2] XPath W3School官方文档:http://www.w3school.com.cn/xpath/index.asp
    [3] lxml Python官方文档:http://lxml.de/index.html

  • 相关阅读:
    folium 增加搜索、经纬度弹出,字段弹出的方法
    Vue移动 HTML 元素到指定位置 teleport 标签
    netty入门例子
    第三十六篇 Vue中使用Swiper
    Let正版短信测压开源源码
    语言的数据结构:树与二叉树(二叉树篇)
    C++11标准模板(STL)- 算法(std::set_difference)
    跟我学c++高级篇——多重模板的扩展
    区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作”
    【数据结构】LRU缓存
  • 原文地址:https://blog.csdn.net/weixin_43790276/article/details/125839249
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号