可以说 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)
但是这个结果有些怪怪的 不是太美观
把数据复制一下 放到新建得一个文件里