XPath
定义
即XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言,它基于XML的树状结构,提供在数据结构树中寻找节点的能力,也适用于HTML文档中;
开发工具
Chrome
在Chrome的应用商店搜索XPath Helper,然后安装这个插件即可;
Firefox
同样的方式,在应用中心查找XPath Checker,然后安装这个插件即可,由于未使用Firefox,便不再演示;
语法
节点选取
表达式 描述 示例
nodename 选词当前节点下节点的所有子节点 div
/ 若在最前,则表示从根节点开始选取,否则选择某节点下的某个节点 /div
// 从全局节点中选取某一节点所在所有位置 //div
@ 选取某一节点属性 //div[@color]
. 选取当前节点 ./div
… 选取当前节点的父节点 …/div
谓语
路径表达式 描述
/markstore/mark[1] 选取markstore下第一个元素
/markstore/mark[last()] 选取markstore下倒数第二个mark元素
markstore/mark[position()<5] 选取markstore下前四个子元素
//mark[@id] 选取拥有id的mark元素
//mark[@id=‘k’] 选取id属性为k的mark元素
通配符
通配符 描述
* 匹配任意节点
@* 匹配节点中的任意属性
node() 匹配任何类型的节点
注意事项
使用方式://获取当前页面所有元素,然后写标签名,最后写谓词进行提取;
/和//的区别:/代表只获取直接子节点,//代表获取子孙节点;
lxml库
安装
使用如下命令安装即可,
pip install lxml
使用
from lxml import etree text = ''' <div> <ul> <li class="id-1"><a href="www.baidu.com">baidu</a></li> <li class="id-2"><a href="www.google.com">Google</a></li> <li class="id-3 id-4" name='item'><a href="www.taobao.com">Taobao</li> </ul> </div> ''' # 解析字符串为html文档 html = etree.HTML(text) # 字符串序列化为html文档,会自动修正HTML文本 result = etree.tostring(html, encoding='utf-8') print(result.decode('utf-8')) # 从文件读取 parser = etree.HTMLParser(encoding='utf-8') html = etree.parse('csdn.html', parser=parser) # 获取所有a标签的href属性 aList = html.xpath('//a/@href') for a in aList: print(a) # 属性多值匹配 html = etree.HTML(text) result = html.xpath('//li[contains(@class, "id-4")/href/text()]') print(result) # 多属性匹配 html = etree.HTML(text) result = html.xpath('//li[contains(@class, "id-4") and @name="item"]/href/text()') print(result) # 按序选择 text = """ <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="links.html">fifth item</a></li> </ul> </div> """ html = etree.HTML(text) # 注意,xpath匹配中序号是以1开头的,而不是以0开头的 result = html.xpath('//li[1]/a/text()') print(result) result = html.xpath('//li[last()]/a//text()') print(result) result = html.xpath('//li[last()-2]/a/text()') print(result) result = html.xpath('//li[position()<3]/a/text()') print(result)
总结
本文主要介绍了爬虫中数据解析时所需要的用的XPath和lxml库,介绍了它们的安装方式和简单的使用方式,如果你有更好的建议和想法,欢迎留言指正。