python 爬虫(XPATH使用)
XPATH简介:
Xpath(XML PAth Language)是一门在XML文档中查找信息的语言,可用来在XML文档中对元素和属性进行遍历。
W3School官方文档: https://www.w3school.com.cn/xpath/index.asp
下载LXML
pip install lxml
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
如果出现网络延迟,可使用清华源进行安装
一、使用
1、导入LXML
导入两种导入方式
第一种:直接导入
from lxml import etree
注意:此种导入方式,可能会报错(etree下面会出现红色波浪线,不影响正常使用)
第二种:正规军
from lxml import html
etree = html.etree
2、基本使用
1、etree.HTML() 将字符串转换成HTML元素对象,可以自动添加缺失的元素
html = etree.HTML(str) # <Element html at 0x2179d48>
print(html) # <Element html at 0x39dec88>
2. tostring()方法:
2.1 tostring() 查看转换之后的内容(二进制类型)
如果想要查看字符串类型,需要解码
如果想要显示汉字,需要先编码,再解码
content = etree.tostring(html,encoding='utf-8')
print(content.decode())
2.2 xpath()方法 作用:提取页面数据,返回值是一个列表
xpath的使用一定是建立在etree.HTML()之后的内容中的
xpath是如何来提取页面数据的?
答:使用的是路径表达式
windows:D:\19课堂\offcn_live\xxxx.exe
2.2.1 xpath路径分为两种:
第一种:/ 代表一层层的查找,如果/存在于开头,代表根路径
例如:查找bookstore标签
bookstore = html.xpath('/html/body/bookstore')
print(bookstore) # [<Element bookstore at 0x39d5d48>]
第二种:// 任意路径 焦点在元素身上
例如:查找bookstore标签
bookstore = html.xpath('//bookstore')
print(bookstore) # [<Element bookstore at 0x39d5d88>]
第一种和第二种结合
例如:查找所有book标签
book = html.xpath('//bookstore/book')
print(book) # [<Element book at 0x39d5d48>, <Element book at 0x39d5c48>, <Element book at 0x39d5d88>, <Element book at 0x39d5dc8>, <Element book at 0x39d5e08>]
2.2.2 /text() 获取标签之间的内容
例如:获取所有title标签的内容
步骤:
1. 找到所有title标签
2. 获取内容
title = html.xpath('//book/title/text()')
print(title) # ['Harry Potter', 'Learning XML', '西游记', '水浒传', '三国演义']
2.3 谓语 使用[] 可以理解成条件
2.3.1 [n] 代表获取第n个元素,n是数字,n>=1
例如:获取第二个title标签
title = html.xpath('//book[2]/title/text()')
print(title) # ['Learning XML']
last() 获取最后一个
同理:last()-1 获取倒数第二个
例如:获取最后一本书的title标签之间的内容
title = html.xpath('//book[last()]/title/text()')
print(title) # ['三国演义']
2.3.2 position() 位置,范围 支持 > / < / = / >= / <= / !=
例如:获取最后两本书的title标签之间的内容
步骤:
- 先获取后两本书
- 获取内容
title = html.xpath('//book[position()>3]/title/text()')
title = html.xpath('//book[position()>last()-2]/title/text()')
print(title) # ['水浒传', '三国演义']
2.3.3 获取属性值:@属性名
例如:获取lang属性值为cng的title标签的内容
title = html.xpath('//book/title[@lang="cng"]/text()')
print(title) # ['西游记']
例如:获取包含src属性的title标签的内容
title = html.xpath('//book/title[@src]/text()')
print(title)
例如:获取包含属性的title标签的内容
title = html.xpath('//book/title[@*]/text()')
print(title) # ['Harry Potter', 'Learning XML', '西游记', '水浒传', '三国演义']
例如:获取最后一个title标签的src属性的值
title = html.xpath('//book[last()]/title/@src')
print(title) # ['https://www.jd.com']
例如:获取所有包含src属性的标签之间的内容
node = html.xpath('//*[@src]/text()')
print(node) # ['Harry Potter', '水浒传', '三国演义']
2.4 and 与 连接的是谓语(条件)
例如:获取lang="dng"并且class="t1"的title标签的内容
title = html.xpath('//book/title[@lang="dng" and @class="t1"]/text()')
title = html.xpath('//book/title[@lang="dng"][@class="t1"]/text()')
print(title) # ['三国演义']
2.5 or 或 连接谓语
例如:查找lang="cng"或者lang="bng"的title标签的内容
title = html.xpath('//book/title[@lang="cng" or @lang="bng"]/text()')
print(title)
2.6 | 连接路径
例如:获取所有title标签和price标签之间的内容
title_price = html.xpath('//title/text() | //price/text()')
print(title_price) # ['Harry Potter', '29.99', 'Learning XML', '39.95', '西游记', '69.95', '水浒传', '29.95', '三国演义', '29.95']
2.7 parse() 作用:从文件中读取数据
注意:读取的文件,必须满足xml格式(不存在单标签,全部都是双标签)
content = etree.parse('Node.html')
print(content) # <lxml.etree._ElementTree object at 0x00000000039D5D48>
res = etree.tostring(content)
print(res)