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

2023-11-18

快速入门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   选取此节点的所有子节点。
    /   从根节点选取。正斜杠也是路径分隔符。
    //  从任意位置选取文档中的节点。
    .   选取当前节点。
    ..  选取当前节点的父节点。
    @   选取当前节点的属性。

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

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

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>元素。

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

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

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

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

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

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

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

  • 安装命令:
pip install lxml
  • 实战演练:
# coding=utf-8
from lxml import etree

text = '''
<!DOCTYPE html>
<html>
<head>
    <title>XPath Test</title>
</head>
<body>
<div>
    <ul>
         <li id="1" class="item"><a href="link1.html">first item</a></li>
         <li id="2" class="item"><a href="link2.html">second item</a></li>
         <li id="3" class="item-inactive"><a href="link3.html">third item</a></li>
         <li id="4" class="project"><a href="link4.html">first project</a></li>
         <li id="5" class="project"><a href="link5.html">second project</a></li>
    </ul>
</div>
</body>
</html>
'''
# 利用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)
<Element html at 0x1c3be4c9740>
b'<html>\n
<head>\n<title>XPath Test</title>\n</head>\n
<body>\n<div>\n    
<ul>\n         
<li id="1" class="item"><a href="link1.html">first item</a></li>\n         
<li id="2" class="item"><a href="link2.html">second item</a></li>\n         
<li id="3" class="item-inactive"><a href="link3.html">third item</a></li>\n         
<li id="4" class="project"><a href="link4.html">first project</a></li>\n         
<li id="5" class="project"><a href="link5.html">second project</a></li>\n    
</ul>\n
</div>\n</body>\n
</html>\n'

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

以上就是本文的全部内容,如果本文可以帮助你快速入门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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • React学习之扩展浅比较(三十四)

    注意 这玩意也已经被React PureComponent的功能取代了 这里依旧是提一下 主要是React v15的版本中的react with addons js 这些玩意还存在 哎 害人呐 引入 import shallowCompar
  • c#图像保存为icon

    Icon操作类 实现了将Image图像向Icon的转化 调用示例 Image pic Image FromFile D tmp 2 png IconTool SaveToIcon pic D tmp test2 ico class Icon
  • 5.x Linux RT-Preempt补丁和ARM平台RT-test编译

    1 在make menuconfig中 5 x版本内核的RT Preempt设置在General Setup下面 2 ARM平台的RT test编译 git clone git git kernel org pub scm utils rt
  • springboot 集成elasticsearch遇到的坑

    最近开始学习elasticsearch 所以就想着在springboot里面集成一下elasticsearch 结果遇到了不少麻烦 下面总结一下 但愿大家和自己以后都少走弯路 首先声明下 本人开始学习elasticsearch的时候 官网最
  • python-类变量(类属性),实例变量(实例属性),self作用

    类中定义的变量又称之为属性 类中定义的函数又称之为方法 类中 所有函数 方法 之外 此范围定义的变量 称为类属性或类变量 类中 所有函数 方法 内部 以 self 变量名 的方式定义的变量 称为实例属性或实例变量 类中 所有函数 方法 内部
  • nuxt3 pinia pinia-plugin-persistedstate

    安装pinia yarn add pinia pinia nuxt 或者使用 npm npm install pinia pinia nut 安装pinia plugin persistedstate npm npm i pinia plu
  • x-studio(Lua调试器,粒子编辑器,UI编辑器,代码编辑器,csb恢复工具)

    最新版本 x studio 10 0 9000 29 2020年4月14日更新 官网 https x studio net 官方教程 https docs x studio net x studio是一款强大的游戏开发IDE 由作者历时5年
  • 如何从零开始写小程序

    看了这篇文章 即使让我现在就从头写一个能够正常运行的小程序 也没有原本想象中的那么难了 在本文中 我们将会以一个具体的小程序为例 带领大家从零到一完成一个小程序的开发流程 并将这个小程序上传到 FinClip com 进行小程序提审与上架操
  • 信息收集之 绕过CDN获取真实IP地址

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 专栏简介 此文章已录入专栏 网络安全快速入门 CDN绕过 一 为什么要绕过CDN 二 如何识别CDN 1 nslookup解析
  • 多线程总结

  • Android 5.0 API新增和改进

    API 级别 21 Android 5 0 LOLLIPOP 为用户和应用开发者提供了新的功能 本文档介绍了最值得注意的新 API 有关新平台功能的扼要介绍 另请参阅 Android Lollipop 集锦 开始开发 要构建 Android
  • 硬件设计---了解电源篇

    1 概述 在高速电路设计中一块单板上常存在多种电源 3 3V 1 8V 1 2V 1 0V 0 9V 0 75V等 有时光是对FPGA供电就需要五六种电源 为了便于使用往往用户只需要提供一种或几种电源 然后经过板上电源模块转换到各个目标电源
  • 二、Docker安装及使用教程(Windows版)

    Docker安装及使用教程 Windows版 1 下载安装 2 启用windows Hyper V虚拟引擎 1 打开设置 2 搜索 启用或关闭 windows 功能 3 勾选Hyper V服务 4 根据提示重启电脑 等待更新即可 2 启动D
  • iOS 开发之 AutoLayout 自动布局

    iOS 开发之 AutoLayout 自动布局 frame 原点自身的尺寸 来确定自身的位置 autoLayout 根据参照视图的位置来定义自己的位置 autoLayout 约束视图和视图的关系来分配屏幕上的位置 使用VFL Visual
  • python计算机视觉KNN算法、稠密Dense-sift及图像手势识别

    KNN算法 一 KNN算法概述 1 kNN算法又称为k近邻分类 k nearest neighbor classification 算法 最简单平凡的分类器也许是那种死记硬背式的分类器 记住所有的训练数据 对于新的数据则直接和训练数据匹配
  • BigDecimal的使用

    在计算金额的时候 实际上整数 浮点数有时候有点捉襟见肘 于是math包提供了一个Bigdecimal类 所以可以学习一下这个BigDecimal的源码和使用 首先是看一下他的构造方法 看起来构建的方式很多 但实际上之间的差别很大 举个例子就
  • 计算机音乐花之舞谱,Flower Dance(花之舞)简谱 DJ OKAWARI 空灵、自然、唯美的花之舞,花儿舞了,我醉了。...

    DjOkawari 的作曲风格一向是空灵却又自然的 FlowerDance 作为广为人知的一首曲子非常完美的体现出来了他自己的风格 它将流行曲的跳跃激昂与古典乐曲的优美完美的结合在一起 给人最直观的感受便是它那种空灵的美感 你甚至可以想象到
  • 数学建模代码速成~赛前一个月~matlab~代码模板~吐血总结~三大模型代码(预测模型、优化模型、评价模型)

    目录 一 预测模型 1 BP神经网络预测 2 灰色预测 3 拟合插值预测 线性回归 4 时间序列预测 5 马尔科夫链预测 6 微分方程预测 7 Log
  • nacos安装配置

    1 下载 sentos安装 先下在安装包 nacos server 2 0 3 tar gz nacos官网 https nacos io zh cn 2 解压安装 上传安装包至linux系统 使用 tar zxvf nacos serve
  • 快速入门XPath语法,轻松解析爬虫时的HTML内容

    快速入门XPath语法 轻松解析爬虫时的HTML内容 爬虫时 很多网站返回的是HTML文件 可以用正则表达式 re库 或XPath语法来匹配目标内容 这两种方法属于爬虫的基本技能 实战中要会灵活运用 对于一些结构和内容复杂的HTML 用re