XPath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

在爬虫中主要用于对html进行解析

要解析的html:

from lxml import etree

# 要解析的html标签
html_str = """
<li data_group="server" class="content">
<a href="/commands.html" class="index" name="a1">第一个a标签</a>
<a href="/commands.html" class="index2" name="a2">第二个a标签</a>
<a href="/commands/flushdb.html">
<span class="first">
这是第一个span标签
<span class="second">
这是第二个span标签,第一个下的子span标签
</span>
</span>
<span class="third">这是第三个span标签</span>
<h3>这是一个h3</h3>
</a></li>
"""

1. 对文件进行读取解析操作

# 解析xpath.html文件
html = etree.parse('xpath.html')
print(html, type(html)) # <lxml.etree._ElementTree object at 0x00000141445A08C8> <class 'lxml.etree._ElementTree'>
a = html.xpath("//a")
print(a, type(a)) # [<Element a at 0x141445a0808>, <Element a at 0x141445a0908>, <Element a at 0x141445a0948>] <class 'list'>

2. 找标签的属性信息

# 找到所有a标签的href和text
a = html.xpath("//a")
a_href = html.xpath("//a/@href")
a_text = html.xpath("//a/text()")
print(a, type(a)) # [<Element a at 0x191c1691888>, <Element a at 0x191c1691848>, <Element a at 0x191c1691948>] <class 'list'>
print(a_href, type(a_href)) # ['/commands.html', '/commands.html', '/commands/flushdb.html'] <class 'list'>
print(a_text, type(a_text), len(a_text))

3. 找到指定的标签

# 找到class="first"的span标签
span_first = html.xpath("//span[@class='first']")
span_first_text = html.xpath("//span[@class='first']/text()")
print(span_first, type(span_first)) # [<Element a at 0x191c1691888>, <Element a at 0x191c1691848>, <Element a at 0x191c1691948>] <class 'list'>
print(span_first_text, type(span_first_text)) # ['这是第一个span标签\n\t\t', '\n\t'] <class 'list'>
# 找到第二个a标签
a_second = html.xpath("//a")[1]
# print(a_second, type(a_second)) # <Element a at 0x23844950808> <class 'lxml.etree._Element'>
a_second_text = a_second.text
# ### a_second_t = a_second.get_text
# ###print(a_second_t)
print(a_second_text, type(a_second_text)) # 第二个a标签 <class 'str'>
a_second_href = a_second.get("href")
print(a_second_href) # /commands.html

4. 处理子标签和后代标签

# 找到li标签下的a标签下的所有span标签
span_all = html.xpath("//li/a//span")
print(span_all, type(span_all), len(span_all))
# [<Element span at 0x2d9dcd18888>, <Element span at 0x2d9dcd18988>, <Element span at 0x2d9dcd189c8>] <class 'list'> 3
# 找到li标签下的a标签下的span标签
span = html.xpath("//li/a/span")
print(span, type(span), len(span))
# [<Element span at 0x188548118c8>, <Element span at 0x18854811a08>] <class 'list'> 2

路径表达式

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

匹配属性

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

XPath运算符

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 10
– 减法 6 – 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
< 小于 price<9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<= 小于或等于 price<=9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
> 大于 price>9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
or 或 price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
and 与 price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
mod 计算除法的余数 5 mod 2 1

                                                                                            xpath文档

问题 如何区别    a_second_2 = html.xpath("//li/a/text()")[1]     a_second_1 = html.xpath("//li/a[1]/text()")

a_second_2 = html.xpath("//li/a/text()")[1]
a_second_1 = html.xpath("//li/a[1]/text()")
print(a_second_2, a_second_1) # 第二个a标签 ['第一个a标签'] """
可以看到a_second_2打印的是 第二个a标签
可以看到a_second_1打印的是 第一个a标签
xpath()方法返回的是一个列表类型
a_second_1表示找到li标签下第一个a标签的文本, 返回的是一个列表
a_second_2表示li标签下的a标签下的所有文本第二个
""" """
打印每个a标签的文本
html.xpath("//li/a[1]/text()") html.xpath("//li/a[2]/text()") html.xpath("//li/a[3]/text()") 没有list为空
['第一个a标签'] ['第二个a标签'] ['\n\t', '\n\t', '\n\t', '\n\t']
html.xpath("//li/a/text()")
['第一个a标签', '第二个a标签', '\n\t', '\n\t', '\n\t', '\n\t']
可以发现当a标签下有其它标签时会把\n\t字符也加入到列表中
"""

xpath解析html的更多相关文章

  1. JAVA通过XPath解析XML性能比较(原创)

    (转载请标明原文地址) 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 XML文件解析的4种方法 通常解析XML文件有四种经典的方法.基本的解析方式有两种 ...

  2. 利用XPath解析带有xmlns的XML文件

    在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...

  3. 爬虫系列二(数据清洗--->xpath解析数据)

    一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...

  4. python开发遇到的坑(1)xpath解析ValueError: Unicode strings with encoding declaration are not supported

    Traceback (most recent call last): File "/Users/*******.py", line 37, in <module> Bt ...

  5. xpath解析数据

    xpath解析数据 """ xpath 也是一种用于解析xml文档数据的方式 xml path w3c xpath搜索用法 在 XPath 中,有七种类型的节点:元素.属 ...

  6. xpath 解析 及案例

    xpath解析 编码流程: 1.实例化一个etree对象,且将页面源码加载到该对象中 2.使用xpath函数,且在函数中必须作用一个xpath表达式进行标签的定位 3.使用xpath进行属性和文本的提 ...

  7. Scrapy基础(六)————Scrapy爬取伯乐在线一通过css和xpath解析文章字段

    上次我们介绍了scrapy的安装和加入debug的main文件,这次重要介绍创建的爬虫的基本爬取有用信息 通过命令(这篇博文)创建了jobbole这个爬虫,并且生成了jobbole.py这个文件,又写 ...

  8. @1-4使用Xpath解析豆瓣短评

    使用Xpath解析豆瓣短评 Python爬虫(入门+进阶)     DC学院 本节课程主要介绍解析神器Xpath是什么.Xpath如何安装及使用,以及使用实际的例子讲解Xpath如何解析豆瓣短评的网页 ...

  9. JAVA通过XPath解析XML性能比较

    转自[http://www.cnblogs.com/mouse-coder/p/3451243.html] 最近在做一个小项目,使用到XML文件解析技术,通过对该技术的了解和使用,总结了以下内容. 1 ...

  10. BeautifulSoup与Xpath解析库总结

    一.BeautifulSoup解析库 1.快速开始 html_doc = """ <html><head><title>The Dor ...

随机推荐

  1. python模拟蒙特·卡罗法计算圆周率

    蒙特·卡罗方法是一种通过概率来得到问题近似解的方法,在很多领域都有重要的应用,其中就包括圆周率近似值的计问题. 假设有一块边长为2的正方形木板,上面画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x, ...

  2. linux系统裁剪

    linux系统裁剪 1.简介 最近为了更加了解linux系统的启动过程,通过对系统进行裁剪的的方式来了解整个启动流程.这里记录下过程. 2.环境介绍 vmware12 + centos6.5 + xs ...

  3. Apache Hadoop 2.9.2 的集群管理之服役和退役

    Apache Hadoop 2.9.2 的集群管理之服役和退役 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 随着公司业务的发展,客户量越来越多,产生的日志自然也就越来越大来,可能 ...

  4. Linux性能优化实战:系统的swap变高(09)

    一.实验环境 1.操作系统 root@openstack:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu ...

  5. Tomcat系列(5)——Tomcat配置详细部分

    Tomcat的架构图 Tomcat的组织结构 Tomcat是一个基于组件的服务器,它的构成组件都是可配置的,其中最外层的是Catalina servlet容器,其他组件按照一定的格式要求配置在这个顶层 ...

  6. HDU 2594(求最长公共前后缀 kmp)

    题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串. 思路是将两个字符串拼接在一起,然后直接套用 kmp 算法即可. 要注意用 next 会报编译错误,改成 ...

  7. kubernetes包管理工具Helm安装

    helm官方建议使用tls,首先生成证书. openssl genrsa -out ca.key.pem openssl req -key ca.key.pem -new -x509 -days -s ...

  8. LinkedHashMap源码分析及实现LRU

    概述 从名字上看LinkedHashMap相比于HashMap,显然多了链表的实现.从功能上看,LinkedHashMap有序,HashMap无序.这里的顺序指的是添加顺序或者访问顺序. 基本使用 @ ...

  9. (三)初探maven之使用IDE

    一.在IDE中使用maven 打开Eclipse,在菜单栏依次选中window   => preferences  => Maven  => Installations , 然后添加 ...

  10. sleep、wait、notify、notifyAll的区别

    Sleep 和wait 1. sleep是Thread类的静态方法,wait是Object类中定义的方法2. Thread.sleep不会导致锁行为的改变,如果当前线程是拥有锁的,那么Thread.s ...