XPATH和LXML类库

436 阅读2分钟

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 可以接受bytesstr 的字符串

  • 提取页面数据的思路

    • 先分组,获取一个包含分组标签的列表
    • 后遍历,对获取到的列表的,每一组进行数据的提取
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