一、xpath 简介

究竟什么是 xpath 呢?简单来说,xpath 就是一种在 XML 文档中查找信息的语言

而 XML 文档就是由一系列节点构成的树,例如,下面是一份简单的 XML 文档:

<html><body><div><p>Hello world<p><a href="/home">Click here</a></div></body>
</html>

XML 文档中常见的节点包括:

  • 根节点:html
  • 元素节点:html、body、div、p、a
  • 属性节点:href
  • 文本节点:Hello world、Click here

XML 文档中常见的节点间关系包括:

  • 父子:例如,<p> 和 <a> 是 <div> 的子节点,反之,也称 <div> 是 <p> 和 <a> 的父节点
  • 兄弟:例如,<p> 和 <a> 称为兄弟节点
  • 祖先/后代:例如,<body>、<div>、<p>、<a> 都是 <html> 的后代节点,反之,也称 <html> 是 <body>、<div>、<p>、<a> 的祖先节点

对于网页解析来说,xpath 比 re 更加方便简洁,故 Python 中也提供相应的模块 —— lxml.etree

我们可以使用 pip install lxml 命令进行安装

二、xpath 使用

在正式开始讲解 xpath 的使用方法之前,我们先来构造一个简单的 XML 文档用于测试

在一般的爬虫程序中,XML 文档就是爬取回来的网页源代码

>>> sc = '''
<html><head><meta charset="UTF-8"/><link rel="stylesheet" href="style/base.css"/><title>Example website</title></head><body><div id="images" class="content"><a href="image1.html">Image1<img src="data:image1.jpg"/></a><a href="image2.html">Image2<img src="data:image2.jpg"/></a><a href="image3.html">Image3<img src="data:image3.jpg"/></a></div></body>
</html>
'''

1、导入模块

from lxml import etree

2、构造对象

html = etree.HTML(sc) # 构造 lxml.etree._Element 对象
# lxml.etree._Element 对象还具有代码补全功能
# 假如我们得到的 XML 文档不是规范的文档,该对象将会自动补全缺失的闭合标签
# 我们可以使用 tostring() 方法将对象转化成 bytes 类型的字符串
# 再使用 decode('utf-8') 方法将 bytes 类型的字符串转化为 str 类型的字符串
print(etree.tostring(html).decode('utf-8'))

3、匹配数据

我们可以使用 xpath() 方法进行匹配

(1)xpath 匹配语法

xpath 方法接受一个满足 xpath 匹配语法的字符串作为参数

下面主要介绍一下 xpath 匹配语法:

  • / 表示子代节点,例如 /E 表示匹配根节点下的子节点中的 E 元素节点

    test = html.xpath('/html/head/title')

  • // 表示后代节点,例如 //E 表示匹配根节点下的后代节点中的 E 元素节点

     test = html.xpath('//a')

  • * 表示所有节点,例如 E/* 表示匹配 E 元素节点下的子节点中的所有节点

    test = html.xpath('/html/*')

  • text() 表示文本节点,例如 E/text() 表示匹配 E 元素节点下的子节点中的文本节点

    test = html.xpath('/html/head/title/text()')

  • @ATTR 表示属性节点,例如 E/@ATTR 表示匹配 E 元素节点下的子节点中的 ATTR 属性节点

    test = html.xpath('//a/@href')

  • 谓语 用于匹配指定的标签

    • 指定第二个 <a> 标签

      test = html.xpath('//a[2]')

    • 指定前两个 <a> 标签

       test = html.xpath('//a[position()<=2]')

    • 指定带有 href 属性的 <a> 标签

      test = html.xpath('//a[@href]')

    • 指定带有 href 属性且值为 image1.html 的 <a> 标签

      test = html.xpath('//a[@href="image1.html"]')

    • 指定带有 href 属性且值包含 image 的 <a> 标签

      test = html.xpath('//a[contains(@href,"image")]')

(2)_Element 对象

xpath 方法返回字符串或者匹配列表,匹配列表中的每一项都是 lxml.etree._Element 对象

下面主要介绍一下 _Element 对象的常用属性与方法:

我们先用 xpath 方法得到匹配列表 tests 作为测试样例,tests 中的每一项都是一个 _Element 对象

test = html.xpath('//a[@href="image1.html"]')
obj = test[0]

  • tag 返回标签名
>>> obj.tag
'a'

  • attrib 返回属性与值组成的字典
>>> obj.attrib
{'href': 'image1.html'}

  • get() 返回指定属性的值
>>> obj.get('href')
'image1.html'

  • text 返回文本值
>>> obj.text
'Image1'

转载于:https://www.cnblogs.com/geogre123/p/11307467.html

xpath的基本使用相关推荐

  1. Python的Xpath介绍和语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  2. Python案例:使用XPath的爬虫

    案例:使用XPath的爬虫 现在我们用XPath来做一个简单的爬虫,我们尝试爬取某个贴吧里的所有帖子,并且将该这个帖子里每个楼层发布的图片下载到本地. # tieba_xpath.py#!/usr/b ...

  3. Python:XPath与lxml类库

    什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...

  4. xpath选择器简介及如何使用

    xpath选择器简介及如何使用 一.总结 一句话总结:XPath 的全称是 XML Path Language,即 XML 路径语言,它是一种在结构化文档(比如 XML 和 HTML 文档)中定位信息 ...

  5. python xpath用法_Python--xpath的使用

    chromedriver的版本问题:如果出现版本不匹配,可以尝试换一个版本的chromedriver: web自动化的元素定位--8大元素定位 6种元素: id:---id是唯一的,这时候可以用id定 ...

  6. DOM+XPath提取规则注记!

    下面是使用DOM+Xpath提取html中页面时经常使用的Xpath规则的一些示例: XPath相关的规则 没有属性 //B[not(@*)] 没有类属性 //B[not(@class)] 要求链接有 ...

  7. XPath与多线程爬虫

    一.  Xpath的介绍与配置 1.      XPath是什么 XPath是一门语言 XPath可以在XML文档中查找信息 XPath支持HTML XPath通过元素和属性进行导航 总结: XPat ...

  8. 爬虫之Xpath详解

    爬虫之Xpath详解 XPath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 是 W3C XSLT 标准的主要元素, ...

  9. python爬取疫情信息html.xpath p标签_python xpath 如何过滤div中的script和style标签

    爬取一个页面中的div,想获取div中的文字,我是这么写的: selector.xpath('//div[@class="text-con"]').xpath('string(.) ...

  10. 【Python】数据提取xpath和lxml模块(糗事百科的爬虫)

    程序中用到的一些零碎知识点: 一.列表推导式:帮助我们快速生成一堆数据的列表 1.format:字符串格式化的一种方式 >>> ["10月{}日".format( ...

最新文章

  1. AIX VNC setup
  2. mysql非聚集索引区间查询_mysql的聚集索引和非聚集索引,回表查询,索引覆盖,最左前缀原则略解...
  3. 使用@Autowired注入RedisTemplate时报java.lang.NullPointerException
  4. mclmcrrt77 matlab,mclmcrrt77.dll下载
  5. DataTable排序的一般方法
  6. AS使用NDK Cmake方式依赖第三方库注意事项
  7. Android 使用 Gradle 打包 - 签名配置
  8. openSUSE Tumbleweed 支持 Linux Kernel 4.20
  9. 2021-08-24fine-tuning 模型
  10. css3波浪js特效代码
  11. 中国科学院大学2019年数学分析考研试题
  12. 渲梦工厂V2.1.5.0简体中文官方版,作图快10倍~
  13. Android开发丶底部导航栏
  14. matlab 矩阵求和计算
  15. 微信文章如何自动排版
  16. 初识云原生安全:云时代的最佳保障
  17. [TC6194]AllWoundUp
  18. [Ec Final 2018] Misunderstood … Missing
  19. Kubernetes集群搭建以及基本使用【具详细】;
  20. QT界面树形浏览与界面切换简单设计

热门文章

  1. 对于小波分解和傅立叶分解的理解
  2. Android中软键盘弹出时关于布局的问题
  3. 字符串替换(C++)
  4. VS 2008 xml文件(包括web.config)高亮显示和智能提示失效修复
  5. [原创]二维数组的动态分配及参数传递
  6. Flutter轮播图
  7. Apriori算法实现
  8. 给tomcat 配置https
  9. Activiti手动执行的应用(UserTask)
  10. Spring4 事务管理