前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >什么是XPath?

什么是XPath?

作者头像
HammerZe
发布2022-05-09 18:15:21
1.7K0
发布2022-05-09 18:15:21
举报
文章被收录于专栏:Hammer随笔

XPath语法和lxml模块

什么是XPath?

xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。

XPath开发工具

Chrome插件XPath Helper。

安装方法:

  1. 打开插件伴侣,选择插件
  2. 选择提取插件内容到桌面,桌面上会多一个文件夹
  3. 把文件夹放入想要放的路径下
  4. 打开谷歌浏览器,选择扩展程序,开发者模式打开,选择加载已解压的扩展程序,选择路径打开即可

Firefox插件Try XPath。

XPath节点

在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

XPath语法

使用方式:

使用//获取整个页面当中的元素,然后写标签名,然后在写谓语进行提取,比如:

代码语言:javascript
复制
//title[@lang='en']
//标签[@属性名='属性值']
代码语言:javascript
复制
# 如果想获取html标签下的body标签
html/body

谓语:谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。在下面的表格中,列出了带有谓语的一些路径表达式

通配符

只要book标签带有属性都可以通过//book[@*]匹配到

选取多个路径

通过在路径表达式中使用|运算符,可以选取若干个路径

代码语言:javascript
复制
# 选取所有book元素以及book元素下所有的title元素
//bookstore/book|//book/title

运算符

需要注意的知识点:

  1. /和//的区别:/代表只获取子节点,//获取子孙节点,一般//用的比较多,当然也要视情况而定
  2. contains:有时候某个属性中包含了多个值,那么可以使用contains函数,示例如下:
代码语言:javascript
复制

//title[contains(@lang,'en')] 

3. 谓词中下标是从1开始的,不是从0开始的

lxml库

lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。 lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

👉lxml python 官方文档:http://lxml.de/index.html

👉需要安装C语言库,可使用 pip 安装:pip install lxml

基本使用:

我们可以利用他来解析HTML代码,并且在解析HTML代码的时候,如果HTML代码不规范,他会自动的进行补全

代码语言:javascript
复制
from lxml import etree

text = '''
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html">third item</a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a>
     </ul>
 </div>
'''
# 将字符串解析为html文档
html = etree.HTML(text)
print(html)
# 按字符串序列化html
result = etree.tostring(html).decode('utf-8')
print(result)

从文件中读取html代码:

代码语言:javascript
复制
#读取
html = etree.parse('hello.html')

result = etree.tostring(html).decode('utf-8')
print(result)

在lxml中使用xpath语法

代码语言:javascript
复制
<!-- hello.html -->
<div>
    <ul>
         <li class="item-0"><a href="link1.html">first item</a></li>
         <li class="item-1"><a href="link2.html">second item</a></li>
         <li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
         <li class="item-1"><a href="link4.html">fourth item</a></li>
         <li class="item-0"><a href="link5.html">fifth item</a></li>
     </ul>
 </div>

语法练习

代码语言:javascript
复制
from lxml import etree
html = etree.parse('hello.html')
# 获取所有li标签:
# result = html.xpath('//li')
# print(result)
# for i in result:
#     print(etree.tostring(i))
# 获取所有li元素下的所有class属性的值:
# result = html.xpath('//li/@class')
# print(result)
# 获取li标签下href为www.baidu.com的a标签:
# result = html.xpath('//li/a[@href="www.baidu.com"]')
# print(result)
# 获取li标签下所有span标签:
# result = html.xpath('//li//span')
# print(result)
# 获取li标签下的a标签里的所有class:
# result = html.xpath('//li/a//@class')
# print(result)
# 获取最后一个li的a的href属性对应的值:
# result = html.xpath('//li[last()]/a/@href')
# print(result)
# 获取倒数第二个li元素的内容:
# result = html.xpath('//li[last()-1]/a')
# print(result)
# print(result[0].text)
# 获取倒数第二个li元素的内容的第二种方式:
result = html.xpath('//li[last()-1]/a/text()')
print(result)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • XPath语法和lxml模块
    • 什么是XPath?
      • XPath开发工具
        • XPath节点
          • XPath语法
            • 使用方式:
            • 谓语:谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。在下面的表格中,列出了带有谓语的一些路径表达式
            • 通配符
            • 选取多个路径
            • 运算符
            • 需要注意的知识点:
          • lxml库
            • 基本使用:
            • 从文件中读取html代码:
            • 在lxml中使用xpath语法
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档