XPATH和LXML类库
为什么要学习XPATH和LXML类库
- lxml是一款高性能的python html/xml解析器,我们可以利用XPATH,来快速的定位特定元素以及获取节点信息
什么是XPATH
- XPath(XML Path Language)是一门在HTML/XML文档中查找信息的语言,可以用来在HTML/XML文档中对元素和属性进行遍历。
XML的节点关系
- 节点的概念:每个XML的标签我们都称为节点
Xpath 学习重点
-
使用XPath 或者chrome中的copy xpath都是从element中提取的数据,但是爬虫获取的是url对应的响应,往往和elements不一样
-
获取文本
a/text()获取a标签文本a//text()获取a标签下所有文本
-
@符号- 获取属性
a/@属性名 - 快速定位
//ul[@id="detail-list"]---//忽略路径在当前节点下快速寻找全部符合的节点,[]添加限制
- 获取属性
LXML
- 使用入门:
- 导入lxml的etree库
- from lxml import etree
- 利用etree.HTML,将字符串转化为Element对象
- Element对象具有XPATH的方法
- html = etree.HTML(text)
- LXML可以自动修正html代码
html = etree.HTML(text = str) #将字符串转化为Element对象
print(html) # -> <Element html at 0x240858ea100>
print(etree.tostring(html, encoding="UTF-8").decode()) ## 查看Element对象中包含的字符串,转义中文
使用lxml注意点
-
lxml能修正HTML代码,但是可能会改错
- 使用etree.tostring,观察修改后的html样子,根据修改之后的html字符串写xpath
-
lxml 可以接受
bytes和str的字符串 -
提取页面数据的思路
- 先分组,获取一个包含分组标签的列表
- 后遍历,对获取到的列表的,每一组进行数据的提取
ret = html.xpath("//a")
item = []
# 以防数据对应不上
for ele in ret:
# 若获取不到属性,则设置为None
item.append({"title": ele.xpath("./@title")[0] if len(ele.xpath("./@title")) > 0 else None,
"href": "https://www.bilibili.com" + ele.xpath("./@href")[0] if len(ele.xpath("./@href")) > 0 else None