xpath语法与lxml库
Posted vinson-cheung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xpath语法与lxml库相关的知识,希望对你有一定的参考价值。
1.什么是XPath
- 一种在XML和html文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历
2.节点
-
节点类型
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。其中,XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。
比如说:
<?xml version="1.0" encoding="UTF-8"?> <bookstore> #文档节点 <book> <title lang="en">Harry Potter</title> #lang="en"属性节点 <author>J K. Rowling</author> #元素节点 <year>2005</year> <price>29.99</price> </book> </bookstore>
-
基本值(原子值)
基本只是无父或无子的节点
JJ K. Rowling "en"
-
节点关系
①父:每个元素及属性都有一个父
②子:元素节点可有零个、一个、多个子
③同胞:拥有相同的父的节点
④先辈:某节点的父、父的父
⑤后代:某个节点的子、子的子,等等
3.语法
-
选取节点
表达式 描述 nodename(节点名) 选取此节点的所有子节点 / 从根节点选取 // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 . 选取当前节点,比如说 ‘.//a‘ 就是获取某一个节点下的a标签,而不是整个文档中的a标签 .. 选取当前节点的父节点 @ 选取属性 -
谓语
谓语是用来查找某个特定的节点或者包含某个指定的值的节点
路径表达式 结果 /bookstore/book[1] 选取 bookstore 子元素的第一个 book 元素 /bookstore/book[last()] 选取 bookstore 子元素的最后一个 book 元素 /bookstore/book[last()-1] 选取 bookstore 子元素的倒数第二个 book 元素 /bookstore/book[position()<2] 选取第一个 bookstore 的子元素 book 元素 //title[@lang] 选取有 lang 属性的 title 元素 //title[@lang=‘eng‘] 选取有值为 eng 的 lang 属性的 title 元素 /bookstore/book[price>35.00]//title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00
- 选取未知节点
通配符 描述 例子 * 匹配任何元素节点 /bookstore/*,选取bookstore的所有子元素 @* 匹配任何属性节点 //title[@*],选取所有带有属性的title元素
3.运算符
4.lxml库
- lxml是一个HTML/XML的解析器,主要功能是解析+提取HTML/XML数据
5.基本使用
-
解析html字符串:
from lxml import etree #使用lxml的etree url = ‘www.baidu.com‘ resp = requests.get(url) #获取HTML网页信息 text = resp.text #获取一个 unicode 型的文本数据(字符串) html = etree.HTML(text) #利用etree.HTML,将字符串解析为HTML文档
注:在使用lxml来解析HTML代码的时候,如果HTML代码不规范,它会自动补全。
注:上述定义的html并不是一个字符串,而是一个对象。
-
解析html文件:
在使用 ‘lxml.etree.parse‘ 进行解析时,这个函数默认使用的是 ‘XML‘ 解析器,所以遇到不规范的html代码时会解析错误,这时候要自己指定 ‘HTML‘ 解析器。
parser = etree.HTMLParser(encoding=‘utf-8‘) html = etree.parse(‘文件.html‘,parser=parser) print(etree.tostring(html, encoding=‘utf-8‘).decode(‘utf-8‘)) #将Element对象转换成字符串输出
-
与xpath结合
①获取一个html对象中所有的tr标签
trs = html.xpath(‘//tr‘) # ‘.xpath‘ 返回的是一个list for tr in trs: print(etree.tostring(tr, encoding=‘utf-8‘).decode(‘utf-8‘)) #将Element转换成str输出
②获取第二个tr标签
tr = html.xpath(‘//tr‘)[0] #因为 ‘.xpath‘ 返回的是列表,所以获取第一个元素需要加[0]
③获取所有class等于even的tr标签
trs = html.xpath(‘//tr[@class=‘even‘]‘) for tr in trs: print(etree.tostring(tr, encoding=‘utf-8‘).decode(‘utf-8‘))
④获取所有a标签的href属性的值
datas = html.xpath(‘//a/@href‘) for data in datas: print(data) #该例href的值已经是一个str类型,所以不用再使用 ‘.tostring‘ 方法
⑤获取文本信息
data = tr.xpath(‘./td[3]/text()‘)[0] #xpath返回的永远是list,不要忘记加[0]
注:如果文本信息不是直接在td标签下的话,就要 ‘//text()‘
以上是关于xpath语法与lxml库的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫:通过爬取CSDN博客信息,学习lxml库与XPath语法