python爬虫04 - xpath和lxml模块

在这里插入图片描述
可以说 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)

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值