xPath方法

  • 使用之前先安装好lxml库pip i lxml
  • xPath使用路径表达式在XML文档中进行导航
  • 可以对本地的html文件进行解析也可以直接对html字符串进行解析

Xpath常用的规则

  • nodename选取所有的子节点
  • /选取当前节点下的子节点
  • //选取当前节点的子孙节点
  • . 选取当前节点
  • .. 选取当前节点的父节点
  • @选取属性

本地展示

lmxl库用法--xPath - 图1

  • 第一种使用etree.parse方法解析本地
  1. # coding= utf-8
  2. from lxml import etree
  3. html = etree.parse('./index.html',etree.HTMLParser())
  4. print(etree.tostring(html))
  • 第二种方法使用 etree.HTML 方法
  1. # coding= utf-8
  2. from lxml import etree
  3. fp = open('./index.html', 'rb')
  4. html = fp.read().decode('utf-8')
  5. selector = etree.HTML(html) #etree.HTML(源码) 识别为可被xpath解析的对象
  6. print(selector)
  • 匹配所有的节点 使用//*规则匹配
  • 匹配所有指定的节点使用//节点名称
  • 匹配所有的子节点将//换成/
  • 获取父节点属性值的方法 ../@属性名
  • 属性匹配可以使用@属性名的方法
  • 文本获取两种方法 /text()//text(), 区别第一种直接获取文本, 第二种要获取换行时产生的特殊字符
  • 属性获取使用/@href获取
  • 获取属性中包含多个值的情况 属性多值匹配 contains()方法
  • 多属性匹配, 使用and运算符 和contains方法搭配使用

xPath运算符

  • 除号和取余特殊, 其他的都与基本运算符一直
  • 除号使用div 比如8 div 4
  • 取余则是mod 比如1 mod 2
  • 还有表示并列和或者的 andor

按序选择

  • xPath内置了100多种函数方法, 具体参考【xPath函数

lmxl库用法--xPath - 图2

节点轴选择

  • 获取当前节点所有子元素的a节点的href属性值 child::a/@href
  • 获取当前节点的指定元素的属性值 attribute:: 属性名
  • 获取当前节点的所有的子元素 child::*
  • 获取当前节点 的所有属性的属性值 attribute::*
  • 获取当前节点所有子节点 child::node()
  • 获取当前元素所有文本子节点 child::text()
  • 获取当前元素的所有父辈为li元素的节点(包括当前元素) ancestor-or-self:: 元素

xPath轴
xPath避坑指南

lmxl库用法--xPath - 图3

演示代码

  1. # coding= utf-8
  2. from lxml import etree
  3. # fp = open('./index.html', 'rb')
  4. # html = fp.read().decode('utf-8') #.decode('gbk')
  5. # selector = etree.HTML(html) #etree.HTML(源码) 识别为可被xpath解析的对象
  6. # print(selector)
  7. html = etree.parse('./index.html',etree.HTMLParser())
  8. # print(etree.tostring(html).decode('utf-8'))
  9. all_node = html.xpath('//*') # 所有节点的获取 //*
  10. part_node = html.xpath('//li') # 部分节点 格式://节点名
  11. child_node = html.xpath('//li/a') # 匹配子节点
  12. parent_node = html.xpath('//a[@href="//mr90.top"]/../@class') # 获取父节点属性值的方法 ../@属性名
  13. attrs_node = html.xpath('//a[contains(@class,"a")]/text()') # 获取属性中包含多个值的情况 属性多值匹配 contains()方法
  14. # 按序获取
  15. first_node = html.xpath('//li[1]/a/text()') # 获取第一个
  16. last_node = html.xpath('//li[last()]//text()') # 获取最后一个节点
  17. front_node = html.xpath('//li[position()<3]//text()') # 获取前两个节点
  18. end_ndoe = html.xpath('//li[last()-2]//text()') # 获取到数第三个节点
  19. # 轴节点
  20. child_node_z = html.xpath('//li[position()<2]/child::a/@href') # 获取当前节点所有子元素的a节点的href属性值
  21. attribute_node = html.xpath('//li[2]//attribute::lang') # 获取当前节点的指定元素的属性值
  22. all_child_node = html.xpath('//ul/li[last()-1]//child::*') # 获取当前节点的所有的文本节点
  23. all_attrs_node = html.xpath('//li[1]/a/attribute::*') # 获取当前节点 的所有属性的属性值
  24. all_child_text_node = html.xpath('//li[1]//child::text()') # 获取当前节点所有文本子节点
  25. all_child_node_node = html.xpath('//li[1]/a/child::node()') # 获取当前节点所有子元素
  26. ancestor_self = html.xpath('//a[@title="1"]/../ancestor-or-self::li') # 获取当前元素的所有父辈为li元素的节点(包括当前元素)
  27. print(ancestor_self)