xpath是一种在XML文档中定位元素的语言,常用于xml、html文件解析,比css选择器使用方便
XML文件最小构成单元:
  - element(元素节点)
  - attribute(属性节点)
  - text(文本)
  - namespace(命名空间)
  - processing-instruction(命令处理)
  - comment(注释)
  - root(根节点)

xpath表达式格式

  xpath通过"路径表达式"来选择节点,在表现形式上与传统的文件系统类似

  绝对路径(absolute path)必须用"/"起首,后面紧跟根节点,比如/step/step/...

  相对路径(relative path)则是除了绝对路径以外的其他写法,比如 step/step,也就是不使用"/"起首

  斜杠(/)作为路径内部的分割符

  "/":表示选择根节点

  "//":表示选择任意位置的某个节点

  "@": 表示选择某个属性

  nodename(节点名称):表示选择该节点的所有子节点

xpath功能函数

使用功能函数能够更好的进行模糊搜索

函数 用法 解释
starts-with xpath(‘//div[starts-with(@id,”ma”)]‘) 选取id值以ma开头的div节点
contains xpath(‘//div[contains(@id,”ma”)]‘) 选取id值包含ma的div节点
and xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘) 选取id值包含ma和in的div节点
text() xpath(‘//div[contains(text(),”ma”)]‘) 选取节点文本包含ma的div节点

xpath定位方法

<?xml version="1.0" encoding="ISO-8859-1"?>

<bookstore>

  <book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book> <book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book> </bookstore>
#bookstore :选取 bookstore 元素的所有子节点。
#/bookstore :选取根节点bookstore,这是绝对路径写法。
#bookstore/book :选取所有属于 bookstore 的子元素的 book元素,这是相对路径写法。
#//book :选择所有 book 子元素,而不管它们在文档中的位置。
#bookstore//book :选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置。
#//@lang :选取所有名为 lang 的属性。
#/bookstore/book[1] :表示选择bookstore的第一个book子元素。
#/bookstore/book[last()] :表示选择bookstore的最后一个book子元素。
#/bookstore/book[last()-1] :表示选择bookstore的倒数第二个book子元素。
#/bookstore/book[position()<3] :表示选择bookstore的前两个book子元素。
#//title[@lang] :表示选择所有具有lang属性的title节点。
#//title[@lang='eng'] :表示选择所有lang属性的值等于"eng"的title节点。
#/bookstore/book[price] :表示选择bookstore的book子元素,且被选中的book元素必须带有price子元素。
#/bookstore/book[price>35.00] :表示选择bookstore的book子元素,且被选中的book元素的price子元素值必须大于35。
#/bookstore/book[price>35.00]/title :表示在例14结果集中,选择title子元素。
#/bookstore/book/price[.>35.00] :表示选择值大于35的"/bookstore/book"的price子元素。
#//book/title | //book/price :表示同时选择book元素的title子元素和price子元素。

例2:

# 我们爬取网页的目的,无非是先定位到DOM树的节点,然后取其文本或属性值

myPage = '''<html>
<title>TITLE</title>
<body>
<h1>我的博客</h1>
<div>我的文章</div>
<div id="photos">
<img src="pic1.jpeg"/><span id="pic1">PIC1 is beautiful!</span>
<img src="pic2.jpeg"/><span id="pic2">PIC2 is beautiful!</span>
<p><a href="http://www.example.com/more_pic.html">更多美图</a></p>
<a href="http://www.baidu.com">去往百度</a>
<a href="http://www.163.com">去往网易</a>
<a href="http://www.sohu.com">去往搜狐</a>
</div>
<p class="myclassname">Hello,\nworld!<br/>-- by Adam</p>
<div class="foot">放在尾部的其他一些说明</div>
</body>
</html>''' html = etree.fromstring(myPage) # 一、定位
divs1 = html.xpath('//div')
divs2 = html.xpath('//div[@id]')
divs3 = html.xpath('//div[@class="foot"]')
divs4 = html.xpath('//div[@*]')
divs5 = html.xpath('//div[1]')
divs6 = html.xpath('//div[last()-1]')
divs7 = html.xpath('//div[position()<3]')
divs8 = html.xpath('//div|//h1')
divs9 = html.xpath('//div[not(@*)]') # 二、取文本 text() 区别 html.xpath('string()')
text1 = html.xpath('//div/text()')
text2 = html.xpath('//div[@id]/text()')
text3 = html.xpath('//div[@class="foot"]/text()')
text4 = html.xpath('//div[@*]/text()')
text5 = html.xpath('//div[1]/text()')
text6 = html.xpath('//div[last()-1]/text()')
text7 = html.xpath('//div[position()<3]/text()')
text8 = html.xpath('//div/text()|//h1/text()') # 三、取属性 @
value1 = html.xpath('//a/@href')
value2 = html.xpath('//img/@src')
value3 = html.xpath('//div[2]/span/@id') # 四、定位(进阶)
# .文档(DOM)元素(Element)的find,findall方法
divs = html.xpath('//div[position()<3]')
for div in divs:
ass = div.findall('a') # 这里只能找到:div->a, 找不到:div->p->a
for a in ass:
if a is not None:
#print(dir(a))
print(a.text, a.attrib.get('href')) #文档(DOM)元素(Element)的属性:text, attrib # .与1等价
a_href = html.xpath('//div[position()<3]/a/@href')
print(a_href) # .注意与1、2的区别
a_href = html.xpath('//div[position()<3]//a/@href')
print(a_href)

Python之xpath的更多相关文章

  1. python爬虫xpath的语法

    有朋友问我正则,,okey,其实我的正则也不好,但是python下xpath是相对较简单的 简单了解一下xpath: XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML ...

  2. python beautifulsoup/xpath/re详解

    自己在看python处理数据的方法,发现一篇介绍比较详细的文章 转自:http://blog.csdn.net/lingojames/article/details/72835972 20170531 ...

  3. Python检查xpath和csspath表达式是否合法

    在做一个可视化配置爬虫项目时,需要配置爬虫的用户自己输入xpath和csspath路径以提取数据或做浏览器操作.考虑到用户的有时会输入错误的xpath或csspath路径,后台需要对其做合法性校验. ...

  4. python爬虫xpath

    又是一个大晴天,因为马上要召开十九大,北京地铁就额外的拥挤,人贴人到爆炸,还好我常年挤地铁早已练成了轻功水上漂,挤地铁早已经不在话下. 励志成为一名高级测试工程师的我,目前还只是个菜鸟,难得有机会,公 ...

  5. Python 关于xpath查找XML元素的一点总结

    关于xpath查找XML元素的一点总结 by:授客 QQ:1033553122   欢迎加入全国软件测试qq群:7156436   测试环境 Win7 64 python 3.4.0 实践出真知 代码 ...

  6. Selenium2+python自动化-xpath定位语法

    前言    在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语 ...

  7. Python中xPath技术和BeautifulSoup的使用

    xpath基本知识 XPath语法:使用路径表达式来选取XML或HTML文档中的节点或节点集 路径表达式 nodename:表示选取此节点的所有子节点 /    : 表示从根节点选取 //   :选择 ...

  8. python使用xpath(超详细)

    使用时先安装 lxml 包 开始使用 和beautifulsoup类似,首先我们需要得到一个文档树 把文本转换成一个文档树对象 from lxml import etree if __name__ = ...

  9. Python爬虫 XPath语法和lxml模块

    XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...

  10. Python+Requests+Xpath实现动态参数获取实战

    1.古诗文网直接登录时,用浏览器F12抓取登录接口的入参,我们可以看到框起来的key对应的value是动态参数生成的,需获取到: 2.登录接口入参的值一般是登录接口返回的原数据值,若刷新后接口与对应源 ...

随机推荐

  1. 优秀 H5 案例收集 vol.3(不定期更新)

    上期浏览:Vol.1   Vol.2 爱的不同定义,五笔连成爱http://news.163.com/special/fdh5_valentines/ 世界华语悬疑文学大赛—下一位悬疑大师,就是你!h ...

  2. QT5.6.0 鼠标支持

    QT5用QPA换了QWS之后,USB鼠标就不知道怎么支持,网上搜啊搜,各种尝试,终于可以了. export TSLIB_ROOT=/mnt/sdcard/tslib export TSLIB_PLUG ...

  3. Maven的Mirror和Repository

    今天新公司入职,项目经理让迁出项目,心想maven的阿里镜像源挺快的,干脆在配置了公司私服之后自己配置了阿里的镜像源,没成想项目屡屡报错,找不到项目依赖的公司jar包,后来才发现,同事配置mirror ...

  4. CentOS 7 源码安装Ansible 2.x

    1.安装Python 3.x环境 [root@ansible ~]# yum install -y python36 python36-pip git [root@ansible ~]# ln -s ...

  5. spring security结合数据库验证用户-XML配置方式

    之前的用户信息我们都是使用的内存用户,测试例子可以,实际中使用肯定不行,需要结合数据库进行验证用户.这就是本节的重点: 项目目录如下:  在之前的项目中的依赖中添加两个依赖: <dependen ...

  6. Filter FASTA files

    Use a regular expression for filtering sequences by id from a FASTA file, e.g. just certain chromoso ...

  7. CentOS 5 上使用yum同时安装32位和64位包的解决方法

    在centos上使用yum在线安装软件包的时候,有时候会同时安装32位和64位的包.并且在update的时候也会更新双份. 其实让yum只安装64位的包,只要在 /etc/yum.conf 中加个 e ...

  8. SSO 证书配置

    ssodev.crt为开发环境证书ssotest.crt为测试环境证书 将证书拷贝到目录:{JDK}\jre\lib\security 其中 {JDK} 是实际安装JDK的位置.然后cmd进入命令窗口 ...

  9. 因磁盘爆满而导致NameNode HA无法启动

    场景回顾: 测试集群节点分配:35,36是namenode且开启HA,37,38,39即作为datanode,又作为journalnode. 某时间 38节点磁盘爆满,集群中hdfs及依赖的服务全部宕 ...

  10. Spring:通配符的匹配很全面, 但无法找到元素 XXXXX' 的声明

    问题:配置Spring的时候容易发生如题的这样一个经常性的错误,错误如下(以context为例) org.springframework.beans.factory.xml.XmlBeanDefini ...