ToB企服应用市场:ToB评测及商务社交产业平台

标题: Xpath剖析及其语法 [打印本页]

作者: 张国伟    时间: 2024-12-3 23:24
标题: Xpath剖析及其语法
XPath剖析

XPath(XML Path Language)是一种用于在XML和HTML文档中查找信息的语言,其通过路径表达式来定位节点,属性和文本内容,并支持复杂查询条件,XPath 是很多 Web 抓取工具如 Scrapy,Selenium 等的焦点技术之一
XPath 剖析的根本步骤

  1. from lxml import etree
  2. # 使用etree.parser()解析文件路径
  3. parser = etree.HTMLParser(encoding='utf-8')  # 以utf8进行编码
  4. tree = etree.parse('../Learning02/三国演义.html', parser=parser)
  5. print(tree)
  6. #output-> <lxml.etree._ElementTree object at 0x000001A240107000>
  7. # 使用etree.HTML()解析本地文件或网络动态HTML
  8. # 读取文件 解析为字符串
  9. file = open('../Learning02/三国演义.html', 'r', encoding='utf-8')
  10. data = file.read()
  11. root = etree.HTML(data)
  12. print(root)
  13. #整合
  14. root = etree.HTML(open('../Learning02/三国演义.html', 'r', encoding='utf-8').read())
  15. print(root)
  16. #output-> <Element html at 0x1a23e462880>
复制代码
XPath语法

XPath语法可以用于在XML与HTML文档中查找信息的语言
路径表达式

XPath使用路径表达式来定位文档中的节点,路径也可以分为绝对路径与相对路径
绝对路径

从根节点html开始查找到head,再从head下找出title标签
  1. root = etree.HTML(open('../Learning02/三国演义.html', 'r', encoding='utf-8').read())
  2. all_titles = root.xpath('/html/head/title')
  3. for title in all_titles:
  4.     print(etree.tostring(title, encoding='utf-8').decode('utf-8'))
  5. #output-> <title>《三国演义》全集在线阅读_史书典籍_诗词名句网</title>
复制代码
相对路径

相比与绝对路径,相对路径使用率更好,更好用

  1. root = etree.HTML(open('../Learning02/三国演义.html', 'r', encoding='utf-8').read())
  2. all_a = root.xpath('//a')
  3. for a in all_a:
  4.     print(a.text)
  5. #None
  6. #首页
  7. #分类
  8. #作者
  9. #...
复制代码
当前节点

  1. all_a = root.xpath('//a')
  2. print(all_a[1].xpath('./text()')) #./表示当前的a标签
  3. #output-> ['首页']
复制代码
选择属性

  1. # 使用 @ 选择 <a> 标签的 href 属性
  2. all_hrefs = root.xpath('//a[@href]')
  3. for hrefs in all_hrefs:
  4.     print(etree.tostring(hrefs, encoding='unicode'))
复制代码
XPath谓语

谓语是xpath中用于进一步筛选节点的表达式,通常放在方括号[] 内,其可以基于节点的位置,属性值,文本内容或其他条件来选择特定的节点,谓语可以嵌套使用,也可以与其他谓语组合使用

位置谓语

位置谓语用于根据节点在兄弟节点中的位置进行选择,可以使用position()或直接指定位置编号
<ul>获取第一个ul标签中的第一个li标签
  1. #//ul获取的是所有ul,[0]选择第一个
  2. lis = root.xpath('//ul')[0].xpath('./li[1]')
  3. for li in lis:
  4.     print(etree.tostring(li, encoding='unicode'))
  5. #output-> <li><a target="_blank" href="https://www.cnblogs.com/">首页</a></li>
复制代码
使用last()获取最后第一个节点,和导数第二个节点
  1. # 倒一个
  2. last_li = root.xpath('//ul')[0].xpath('./li[last()]')
  3. print(etree.tostring(last_li[0], encoding='unicode'))
  4. # 倒二个
  5. last_second_li = root.xpath('//ul')[0].xpath('./li[last()-1]')
  6. print(etree.tostring(last_second_li[0], encoding='unicode'))
  7. #output-> <li><a target="_blank" href="https://www.cnblogs.com/app/">安卓下载</a></li>
  8. #<li><a target="_blank" href="https://www.cnblogs.com/book/">古籍</a></li>
复制代码
使用position()获取位置进行筛选
[code]# 获取前两个li标签last_li = root.xpath('//ul')[0].xpath('./li[position()




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4