python爬虫04 - xpath和lxml模块

2023-11-04

在这里插入图片描述
可以说 xpath中 x就是不确定 而path就是路径 指向

1. xpath介绍

1.1 基本概念

• XPath(XML Path Language)是一种XML的查询语言,他能在XML树状结构中寻找节点。XPath 用于在 XML 文档中通过元素和属性进行导航
• xml是一种标记语法的文本格式,xpath可以方便的定位xml中的元素和其中的属性值。lxml是python中的一个包(就是python中的lxml模块),这个包中包含了将html文本转成xml对象,和对对象执行xpath的功能

我们全都清楚爬取数据都是在网页源代码中爬取的
那么这个网页源代码 我们俗称就是一个html文件
而这个html文件就特别像一个树
在这里插入图片描述

我们可以在这个大树里根据 元素 结构进行导航从而获得我们想要的这个数据
xml是一种标记语法的文本格式 也就是一种文本格式
html 就是超文本标记语言 xml 就是可扩展标记语言
lxml是python中的一个包(就是python中的lxml模块)
lxml是第三方的需要自己安装

1.2 结点的关系

xml_content = '''
<bookstore>
<book>
    <title lang='eng'>Harry Potter</title>
    <author>J K.Rowing</author>
    <year>2005</year>
    <price>29<price>
</book>
</bookstore>
'''

其实我们可以称book是title 的父类也可以称做是先辈 但是bookstore是title先辈更加准确

<bookstore> 文档结点
<author>J K.Rowing</author> 元素结点
lang='eng' 属性结点
父Parent
book 是 title author year price这些元素的父类
子Children
title author year price这些元素是book的子类
同胞Sibling (就是同一个父节点)
title author year price 元素是同胞

• 父(Parent) book元素是title、author、year、price元素的父
• 子(Children) title、author、year、price都是book元素的子
• 同胞(Sibling) title、author、year、price都是同胞
• 先辈(Ancestor) title元素的先辈是 book元素和bookstore元素

2. 基本使用

2.1 XPath Helper工具安装

常用节点选择工具

----chrome 插件 XPath Helper
----Firefox插件 XPath Checker

下载

链接:https://pan.baidu.com/s/1JU5mafLiKdgzfCM2HEjBdA
提取码:tpzw

安装

chrome浏览器输入:chrome://extensions/
在这里插入图片描述
1.直接将chrome_Xpath_v2.0.2.crx拖动至该扩展程序页面 ;
2.如果安装失败,弹框提示 无法从该网站添加应用、扩展程序和用户脚本 ,则打开开发者模式,将crx文件(直接或后缀修改为rar)并解压成文件夹(最好是个英文的 解压后的文件夹千万不能删除了 要不然插件就没的用了),点击开发者模式的加载已解压的扩展程序,选择解压后的文件夹,点击确定,安装成功
在这里插入图片描述
这就完事了
在这里插入图片描述

使用之困难重重

在用谷歌xpath的功能的时候,想用快捷键ctrl+shift+x进行查找的时候,发现被360截图的热键给占用了,百度了很多方法
在这里插入图片描述

使用

打开Google浏览器
按住ctrl+shift+x
就可以用这个写一些xpath语法来写一些验证
在这里插入图片描述

在这里插入图片描述
先不用去管这个nodename 我们之后再讲

/从根节点选取

我们可以拿那个爬取百度图片的例子来说 img文件夹的路径
longproject/day007/img 就是这样一层一层的
比如你爬取数据 这个数据在一个div 的标签下的link标签下的src
div/link/src 这个时候我们就需要一层一层的 逐层去查找

打开google 按出xpath helper 工具 再检查
\html 从根节点去寻找(左侧) 整个页面的数据就出来了(右侧)
在这里插入图片描述
在这里插入图片描述
highlight 我们的标记增强亮度 鼠标移动的这行的时候 页面选中的特别明显
我们打开head标签中
有一个title
在这里插入图片描述
那么
在这里插入图片描述
其实有时候写xpath语法不确定的时候就可以用这个 进行尝试
最好还要在后面加上/text()在这里插入图片描述
可能两者看起来是一样的效果 但是在代码里就得加上/text()

// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

比如我们找src src在div这个标签下面 但是这个div标签下还有很多的标签 有link herf a 这时候我们发现src在这个a标签下面 ,那么我们会先找到div标签下的所有标签 就是link herf a 这一堆 那么就可以这么写 //div/a/src

举个例子 打开智联招聘
右键选中电子硬件开发工程师 检查
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

谓语 用来查找某个特定结点或者包涵某个指定值得结点 谓语被镶嵌在方括号中

div//[@class=’ ']
将div标签中紫色部分选中复制粘贴到上面
在这里插入图片描述
这时候从图中我们可以看出就已经确定到这个数据了
在这里插入图片描述
再加上/span/text()

在这里插入图片描述
它会把右边这些数据以一个列表的方式返回 到时候就可以用到遍历了

. 选取当前节点 …选取当前节点的父节点

其实这个原理和我们基础班学的DOS命令一样
cd.就是还是在当前目录下
cd..退回上一级目录
拿百度首页做一个示范

图小(1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你会发现两者之间区别不大
换成/…
在这里插入图片描述
这个内容就和图小(1)一样了的

@ 选取属性 & 路径表达式

比如你要找src属性
//div/a/@src

查找某个特定的节点或者包含某个指定的值的节点
在这里插入图片描述
*
@*
在这里插入图片描述

使用

我们再智联招聘下方的招聘信息可以看到页码
那么如何找到第一页的内容
在这里插入图片描述
使用元素选择器选中第一页
那么第一页就在这一行中
在这里插入图片描述
那么就该这么写
//div[@class=‘soupager’]
在这里插入图片描述
在这里插入图片描述
而且页码1处于高亮状态
//div[@class=‘soupager’]/span[last()]
在这里插入图片描述
//div[@class=‘soupager’]/span[last()-1]
在这里插入图片描述
//div[@class=‘soupager’]/span[position()>4]
共5页 大于4就是第5页
在这里插入图片描述
小于2 就是第一页 小于3就是前两页
可以看到1 2页 都有高光的提示
在这里插入图片描述
元素选择器选中这个简历不会写的图片
在这里插入图片描述
在这里插入图片描述
//div[@class=‘browsingHistory rightadbox__history rightadbox-container-fixed’]/a/img/@src
在这里插入图片描述
还有这样写省去img与前者作用一样
//div[@class=‘browsingHistory rightadbox__history rightadbox-container-fixed’]/a//@src

/a/img/@src就是a节点下的img节点下找 选取属性src
/a//@src就是在a节点中的所以节点中选取属性src
在这里插入图片描述

//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置

最后几种种用到的不多 就不用再多演示了 感兴趣的可以玩玩

而且需要注意的是有些数据在elements中有 但是不代表在该网页源代码中有
在这里插入图片描述

安装lxml库

我们使用 pycham 换源安装是最快的(远远快于cmd安装)

也可以选择虚拟环境安装和全局安装
virtualenv 是用来创建 Python 的虚拟环境的库,虚拟环境能够独立于真实环境存在,并且可以同时有多个互相独立的 Python 虚拟环境,每个虚拟环境都可以营造一个干净的开发环境,对于项目的依赖、版本的控制有着非常重要的作用。
虚拟环境有什么意义?打个比喻,现在有一个 Django 项目,使用的 Django 版本是1.8,但是系统的 Django 版本已经是更加新的1.11,如果使用系统的环境来运行项目,可能导致很多不兼容,于是,这个问题就可以使用一个虚拟环境来解决,使用 virtualenv 来创建一个只给这个项目运行的开发环境,既可以保证项目的正常运行,也方便了之后移植项目。
在这里插入图片描述
在这里插入图片描述
在pycharm中换源安装

D:\LongProject>
D:\LongProject>pip install lxml -i https://pypi.douban.com/simple

在这里插入图片描述

successfully installed lxml-4.5.2 这样就安装成功了
在这里插入图片描述
检验是否安装成功
或者也可以直接导入模块 直接运行如果没有报错则就表示安装成功了
在这里插入图片描述

2.2 模块的使用

在Python中,我们安装lxml库来使用XPath 技术
lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取HTML/XML数据利用etree.HTML,将字符串转化为Element对象
lxml python 官方文档:http://lxml.de/index.html
lxml 可以自动修正 html 代码

比如在html文件中找一些数据 可以用正则表达式来匹配 但是有时候会匹配的乱七八糟的
所以我们得用到xpath
xpath中的etree 模块 它需要你先拿到html中的这些数据 然后把这些数据变成一个对象 变成对象有什么好处 对象就封装了很多的功能(方法)
在这里插入图片描述
按住康cuer 点击etree
在这里插入图片描述
lxml.etree模块实现XML的扩展ElementTree API。ElementTree API方法 也就是有许多API方法(简称)
比如说这个HTML方法(function 函数)
在这里插入图片描述
翻译下就是

HTML(文本,解析器=无,基本url=无)
从字符串常量解析HTML文档。返回根
节点(或解析器目标返回的结果)。这个函数
可用于在Python代码中嵌入“HTML文本”。
要用不同的“HTMLParser”重写解析器,可以将其传递给
“`parser``关键字参数。
“`base_url`”关键字参数允许设置
查找外部实体时支持相对路径的文档

我们先找个数据 来练手

wb_data = """
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        """

# import lxml
from lxml import etree
# 1.是可以将html转化为element对象
# 2.element对象又可以转换为字符串或者二进制数据

wb_data="""
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        """
element=etree.HTML(wb_data)
#这个方法能把HTML  lxml变成一个对象


print(element)

<Element html at 0x1e3ac40>
一个element对象

在这里插入图片描述

tostring

tostring 方法是什么 就是
Serialize an element to an encoded string representation of its XML
将元素序列化为其XML的编码字符串表示形式

使用
from lxml import etree
这个etree类能干什么?
• 第一个是将html字符串转化为element对象
• 第二个是element对象可以转换为字符串或者二进制类型


# import lxml
from lxml import etree
# 1.是可以将html转化为element对象
# 2.element对象又可以转换为字符串或者二进制数据
wb_data="""
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        """
element=etree.HTML(wb_data)
#这个方法能把HTML  lxml变成一个对象
r=etree.tostring(element)

print(r)

在这里插入图片描述
但是这个结果有些怪怪的 不是太美观
在这里插入图片描述
把数据复制一下 放到新建得一个文件里

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

python爬虫04 - xpath和lxml模块 的相关文章

随机推荐

  • 从用户登录谈谈测试用例设计

    等价类划分和边界值分析方法是最常用 最典型并且是最重要的黑盒测试方法 一 功能测试用例 针对 用户登录 功能测试 基于等价类划分和边界值分析方法 能够设计的功能测试用例有 1 输入已注册的用户名和正确的密码 验证是否登录成功 2 输入已注册
  • 干货满满!MES生产制造管理全流程分析

    阅读本文您将了解 1 什么是MES生产管理流程 2 MES生产管理流程具体步骤 3 实施MES生产管理流程优势 4 MES生产管理流程中可能会遇见的问题 一 什么是MES生产管理流程 MES生产管理系统 又称制造执行系统 是一种集成了计划
  • C语言--库函数qsort排序

    文章目录 一 C语言 库函数qsort排序 1 1 冒泡排序 1 2 qsort排序 二 模拟实现qsort函数 一 C语言 库函数qsort排序 假设我们要对一个数组元素进行排序 如果是一个整型数组 我们首先可以想到的是冒泡排序 但其实C
  • 腾讯潘安群:腾讯云金融级数据库TDSQL分析

    SDCC 2015将于2015年11月19 21日在北京 朗丽姿西山花园酒店召开 在大会召开之际 笔者采访到了腾讯高级软件工程师潘安群 请他分享TDSQL在腾讯云金融领域的实践经验 SDCC 2015将于2015年11月19 21日在北京
  • python语法--文件基本操作(一)

    python语法 文件基本操作 文件基本操作 打开文件 open name mode encoding name 文件名 可以包括路径 mode 设置打开文件的模式 只读r 写入w 追加a等 encoding 编码格式 推荐utf 8 f
  • layui实现Tree组件前后端交互

    文章目录 前言 运行效果 Tree组件 1 Tree组件的加载方式 1 1选项卡 2 Tree组件的渲染格式 3 基础参数 4 数据源属性选项 后台代码实现 1 定义对应数据格式实体 2 数据转换 3 树结构存储的处理 角色处理 1 思路
  • Zookeeper巨坑的一个问题 & 启动不了zkServer-闪退等情况

    1 配置环境变量 不然无法启动服务 2 此时不应有 java jdk1 8 cmd报这种错误 第一检查java环境变量是否错误 是否包含空格 第二就是我这种情况 一定要注意打开服务需要64位目录下的java
  • C++ 结束进程

    有时候进程未正常退出 导致进程列表遗留僵尸进程 程序启动需要杀死这种僵尸进程 include TLHELP32 H void TerminateSelfApplication TCHAR szFileName MAX PATH 0 TCHA
  • jmeter接口应用3:jmeter后置处理器-正则表达式提取器

    今天将继续讲解jmeter中关于后置处理器中的用法 也叫提取器 详情参考 https www toutiao com article 7195493970682692154 正则表达式提取器 正则表达式提取器提取内容有两种 一种是提取字符串
  • div向右偏移设置 css让div靠右移一定距离

    转自 https www thinkcss com shili 1372 shtml div对象盒子向右偏移设置 使用css让div靠右一定距离 div向右移教程实例篇 div向右偏移一定距离 可采用margin外边距实现 也可以使用pad
  • shell脚本模块化

    shell脚本模块化 模块化的优点 功能清晰 易于维护 便于阅读 代码复用 源代码 只有单一的一个run sh文件 bin bash 功能 更新小程序并重新启动 设置程序出错时不再继续执行 set e 查找app的进程号并杀死该进程 ech
  • 网络端口号和协议号(大全)

    网络端口号 作用 端口号的主要作用是表示一台计算机中的特定进程所提供的服务 网络中的计算机是通过IP地址来代表其身份的 它只能表示某台特定的计算机 但是一台计算机上可以同时提供很多个服务 如数据库服务 FTP服务 web服务等 我们就通过端
  • python中哈希表和set的使用

    哈希表不能将可变对象作为key值 即引用类型的内容不能是可变的 这样不安全 因为hashcode函数是根据对象的内容计算出key和value的位置 如果引用的内容可变 那么每次查找的位置结果都不一样 之前存储的键值对就会找不到 不符合has
  • 区块链技术之分布式存储

    随着互联网技术应用技术的普遍使用 所有行业的数据量指数级增长 数据存储技术都需要更新 分布式存储是一种数据存储技术 它可以跨多个物理服务器传播文件 块存储或者对象存储 以实现高可用性 数据备份和灾难恢复目的 可扩展的存储服务以及数据中心的巨
  • K8S的金丝雀发布(Canary Release)

    金丝雀发布 Canary Release 1 概念 2 相关架构理念 3 金丝雀发布部署操作 4 访问测试 5 金丝雀隔离新的pod 6 重建 7 获取当前集群中所有的终结点 8 登录旧的pod中测试 9 查看更新状态信息 总结 1 概念
  • 树链剖分

    树链剖分 两个核心思想 将一棵树转化成一个序列 树中路径转化成 log n 段连续区间 相关概念 重儿子 某个节点的子节点所构成的子树中 子树节点数量最多对应的子节点为重儿子 如果有多个相同的最大数量 则任选一个为重儿子 也就是说 每个节点
  • Node.js 创建一个简单的web服务器

    Node可以写 web服务器 命令行工具 网络爬虫 桌面应用程序开发等 今天 我们利用node写一个简单的web服务器 一 引入主模块 let http require http 二 创建一个服务器 createServer可以看到源码注入
  • 微信小程序子页面自定义tabbar组件

    一 先言 有时候微信小程序会遇到代码合并 就比如把B小程序代码迁移到A小程序 要使得B作为A小程序的一个子页面子功能 因为本身小程序都有tabbar 原来B也有 这时候就要给B子功能自定义一个tabbar底部导航栏 注意 这个不是微信小程序
  • <转>Java集合框架之小结

    转载自 http jiangzhengjun iteye com blog 553191 1 Java容器类库的简化图 下面是集合类库更加完备的图 包括抽象类和遗留构件 不包括Queue的实现 2 ArrayList初始化时不可指定容量 如
  • python爬虫04 - xpath和lxml模块

    可以说 xpath中 x就是不确定 而path就是路径 指向 1 xpath介绍 1 1 基本概念 XPath XML Path Language 是一种XML的查询语言 他能在XML树状结构中寻找节点 XPath 用于在 XML 文档中通