如需转发,请注明出处:小婷儿的python  https://www.cnblogs.com/xxtalhr/p/10520271.html

有问题请在博客下留言或加作者微信:tinghai87605025 或 QQ :87605025

  python QQ交流群:py_data 483766429

  OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

  OCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

一、xpath 浅谈

1.1 xpath 是什么?

  给某些规律信息找通用表达式,我们首先想到的是正则,然而,对于大部分的我们正则用的是不好的,如果用来处理HTML文档是很累,那么有没有其他的方法?答案是肯定的,有!那就是XPath,我们可以先将网络获取的String类型数据转换成 HTML/XML文档,然后用 XPath 查找 HTML/XML 节点或元素。

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

1.2 lxml 库

  lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

  lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath语法,来快速的定位特定元素以及节点信息。

二、 xpath 路径表达式

2.1 最常用的路径表达式

2.2  常用路径表达式以及表达式的结果

2.3 选取未知节点

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

2.5 xpath的运算符

三、xpath 入门测试

3.1 lxml 读取数据

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>测试页面</title>
</head>
<body>
  <ol>
    <li class="haha">醉卧沙场君莫笑,古来征战几人回</li>
    <li class="heihei">两岸猿声啼不住,轻舟已过万重山</li>
    <li id="hehe" class="nene">一骑红尘妃子笑,无人知是荔枝来</li>
    <li class="xixi">停车坐爱枫林晚,霜叶红于二月花</li>
    <li class="lala">商女不知亡国恨,隔江犹唱后庭花</li>
  </ol>
  <div id="pp">
    <div>
      <a href="http://www.baidu.com">李白</a>
    </div>
    <ol>
      <li class="huanghe">君不见黄河之水天上来,奔流到海不复回</li>
      <li id="tata" class="hehe">李白乘舟将欲行,忽闻岸上踏歌声</li>
      <li class="tanshui">桃花潭水深千尺,不及汪伦送我情</li>
    </ol>
    <div class="hh">
      <a href="http://mi.com">雷军</a>

    </div>
    <div class="jj">
      <b href="http://mi.com"><c>3</c></b>
      <b href="http://mi.com"><c>5</c></b>
      <b href="http://mi.com"><c>6</c></b>
      <b href="http://mi.com"><c>8</c></b>
      <b href="http://mi.com"><c>9</c></b>
      <b href="http://mi.com"><c>3</c></b>

    </div>
    <ol>
      <li class="dudu">are you ok</li>
      <li class="meme">会飞的猪</li>
    </ol>
  </div>
</body>
</html>

3.2 xpath 入门实验

  • lxml 、element 、etree

    •  import requests
      
       # lxml
      # element 标签
      # etree 标签树
      from lxml import etree url = 'https://www.qiushibaike.com/text/' x = '''/html/body/div[@id='content']/div[@class='content-block clearfix']/div[@id='content-left']/div[@id='qiushi_tag_120441381']/div[@class='author clearfix']/a[1]/img/@src''' x = '''/html/body/div[@id='content']/div[@class='content-block clearfix']/div[@id='content-left']/div[@id='qiushi_tag_112124634']/div[@class='author clearfix']/a[1]/img/@src''' x = '//img/@src' x = '''/html/body/div[@id='content']/div[@class='content-block clearfix']/div[@id='content-left']
      /div[@id='qiushi_tag_112124634']/a[@class='contentHerf']/div[@class='content']/span''' x = '//div[@class="content"]/span/text()'
      response = requests.get(url=url,verify = False)
      response.encoding = 'utf-8' # String 串
      html = response.text # 使用etree,转换成标签树
      # json.loads() 类似 html_tree = etree.HTML(html) # print(html_tree)
      # print(etree.tostring(html_tree).decode('utf-8')) # 对etree对象使用xpath方法,根据xpath语句进行数据的查找
      src = html_tree.xpath(x) print(src)
  • 获取所有的 <li> 标签
    •  from lxml import etree
      
       html = etree.parse('hello.html')
      li_list = html.xpath('//li') print(li_list) # 打印<li>标签的元素集合
      print(len(li_list))
  • 继续获取<li> 标签的所有 class属性
    •  from lxml import etree
      
       html = etree.parse('hello.html')
      result = html.xpath('//li/@class')
      print(result)
  • 继续获取<li>标签下hre 为 link1.html 的 <a> 标签
    •  from lxml import etree
      html = etree.parse('./hello.html')
      result = html.xpath('//li/a[@href="link1.html"]')
      print(result)
  • 获取<li> 标签下的所有 <span> 标签
    •  from lxml import etree
      data = '''
      <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>'''
      html = etree.HTML(data)
      result = html.xpath('//li//span')
      print(result[0].text)
  • 获取 <li> 标签下的<a>标签里的所有 class
    •  # 获取 <li> 标签下的<a>标签里的所有 class
      from lxml import etree
      html = etree.parse('hello.html')
      result = html.xpath('//li/a//@class') print(result)
  • 获取最后一个 <li> 的 <a> 的 href
    •  from lxml import etree
      
       xml = etree.parse('./hello.html')
      
       result = xml.xpath('//li[last()]/a/@href')
      
       print(result)
  • 获取倒数第二个元素的内容
    •  from lxml import etree
      
       html = etree.parse('hello.html')
      result = html.xpath('//li[last()-1]/a')
      print(result[0].text)
      print(result)
  • 获取 class 值为 bold 的标签名
    •  # 获取 class 值为 bold 的标签名
      from lxml import etree
      html = etree.parse('hello.html')
      result = html.xpath('//*[@class="bold"]')
      # tag方法可以获取标签名
      print(result[0].tag)
      print(result[0].text)
  • 练习使用xpath获取books该xml文件中的内容

      

 from lxml import etree

 books = '''
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2008</year>
<price>30.00</price>
</book>
<book category="children" lang="zh">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
''' books_tree = etree.HTML(books) books = books_tree.xpath('//book[price<=30][year + 3 = 2008]') print(books) # 将查询到的book中的所有属性选出来
ret = books[0].xpath('.//@*')
print(ret)
  • 数据转换成标签树

 

 from lxml import etree

 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" class="linkjfdlsfjls">third item</a></li>
<li class="shfs-inactive"><a href="link4.html">third item</a></li>
<li class="isjfls-inactive"><a href="link5.html">third item</a></li>
<li class="qwert-inactive"><a href="link6.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_tree = etree.HTML(html) # 方式二,可以将文件中的直接进行转换
html_tree2 = etree.parse('./data.html') # print(html_tree,html_tree2) # print(etree.tostring(html_tree).decode('utf-8'))
# 获取文件中所有的标签li
# xpath返回的数据是列表,标签<Element 内存地址>
li = html_tree.xpath('//li')
# print(li) li = html_tree.xpath('//li[@class="item-1"]')
# print(li[0].xpath('..//a/text()')) # 查询class属性不等于“item-1” 标签
li = html_tree.xpath('//li[@class!="item-1"]')
# print(li) # 查询li标签,class 包含inactive 字符串
li = html_tree.xpath('//li[contains(@class,"inactive")]')
# print(li)
# print(li[0].xpath('./a/@*')) # 查询li标签,class 不包含inactive字符串
li = html_tree.xpath('//li[not(contains(@class,"inactive"))]')
# print(li)
# print(etree.tostring(li[0]).decode('utf-8')) # 查询li标签,class 不包含inactive字符串 同时包含class =item-1
li = html_tree.xpath('//li[not(contains(@class,"inactive"))][@class="item-1"]')
# print(li)
# print(etree.tostring(li[-1]).decode('utf-8')) # 查询li标签,最后一个
# print(etree.tostring(html_tree).decode('utf-8'))
li = html_tree.xpath('/html/body/div/ul/li')
li = html_tree.xpath('//li[last()-1]')
# print(li,etree.tostring(li[0])) # 查询位置小于4的标签
li = html_tree.xpath('//li[position()<4]')
print(li)

欢迎关注小婷儿的博客:

  csdn:https://blog.csdn.net/u010986753

  博客园:http://www.cnblogs.com/xxtalhr/

  有问题请在博客下留言或加作者微信:tinghai87605025 或 QQ :87605025

  python QQ交流群:py_data 483766429

  OCP培训说明连接:https://mp.weixin.qq.com/s/2cymJ4xiBPtTaHu16HkiuA

  OCM培训说明连接:https://mp.weixin.qq.com/s/7-R6Cz8RcJKduVv6YlAxJA

  小婷儿的python正在成长中,其中还有很多不足之处,随着学习和工作的深入,会对以往的博客内容逐步改进和完善哒。

重要的事多做几遍。。。。。。

xpath 的使用的更多相关文章

  1. xpath提取多个标签下的text

    title: xpath提取多个标签下的text author: 青南 date: 2015-01-17 16:01:07 categories: [Python] tags: [xpath,Pyth ...

  2. C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子)

    第一次接触HtmlAgilityPack是在5年前,一些意外,让我从技术部门临时调到销售部门,负责建立一些流程和寻找潜在客户,最后在阿里巴巴找到了很多客户信息,非常全面,刚开始是手动复制到Excel, ...

  3. 在Java中使用xpath对xml解析

    xpath是一门在xml文档中查找信息的语言.xpath用于在XML文档中通过元素和属性进行导航.它的返回值可能是节点,节点集合,文本,以及节点和文本的混合等.在学习本文档之前应该对XML的节点,元素 ...

  4. XPath 学习二: 语法

    XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取的. 下面列出了最有用的路径表达式: 表达式 描述 nodename 选 ...

  5. xpath 学习一: 节点

    xpath 中,有七种类型的节点: 元素.属性.文本.命名空间.处理指令.注释.以及根节点 树的根成为文档节点或者根节点. 节点关系: Parent, Children, sibling(同胞), A ...

  6. Python爬虫利器三之Xpath语法与lxml库的用法

    前面我们介绍了 BeautifulSoup 的用法,这个已经是非常强大的库了,不过还有一些比较流行的解析库,例如 lxml,使用的是 Xpath 语法,同样是效率比较高的解析方法.如果大家对 Beau ...

  7. 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接

    使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...

  8. 关于robotframework,app,appium的xpath定位问题及常用方法

    关于类似的帖子好像很多,但是没有找到具体能帮我解决问题的办法.还是自己深究了好久才基本知道app上面的xpath定位和web上的不同点: 先放一个图: A,先说说不用xpath的场景,一般是用于存在i ...

  9. Selenium Xpath Tutorials - Identifying xpath for element with examples to use in selenium

    Xpath in selenium is close to must required. XPath is element locator and you need to provide xpath ...

  10. xpath定位中starts-with、contains和text()的用法

    starts-with 顾名思义,匹配一个属性开始位置的关键字 contains 匹配一个属性值中包含的字符串 text() 匹配的是显示文本信息,此处也可以用来做定位用 eg //input[sta ...

随机推荐

  1. docker swarm 搭建及跨主机网络互连案例分析

    准备工作 安装docker,不建议直接使用Docker官方的yum install docker wget http://yum.dockerproject.org/repo/main/centos/ ...

  2. Javascript 自动执行函数(立即调用函数)

    开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ...

  3. 为什么 C# 比 C++ 编译快那么多

    Go 我不懂,下面以 C++ 和 C# 对比来说明为什么 C++ 编译慢和 C# 编译快. C 和 C++ 文件的编译经过几个主要步骤: 处理续行符处理(“\”)之类的杂事 词法分析,解析出 toke ...

  4. LyX快捷键管理

    快捷键修改:Tools->Preference->Editing->Shortcuts:修改后要Tools->Reconfig生效 快捷键默认保存文件:%appdata%\Ly ...

  5. 最全的android学习资料

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

  6. Node 编码规范(优秀是一种习惯)

    编码规范 空格与格式 1. 缩进 采用2个空格缩进,而不是tab缩进. 空格在编辑器中与字符是等宽的,而tab可能因编辑器的设置不同.2个空格会让代码看起来更紧凑.明快. 2. 变量声明 永远用var ...

  7. 使用wxpy来实现自动发送消息统计微信好友信息的功能

    发送消息太频繁会出现禁言消息 1:导入wxpy模块 pip install wxpy pip3 install wxpy #二者选一 调用模块 # 导入模块 from wxpy import * # ...

  8. 洗礼灵魂,修炼python(45)--巩固篇—【转载】类的__now__和__init__

    学到这里了,相信你应该对__init__非常熟悉了,就是构造器呗,当类被实例化时初始化的作用 但__init__其实不是实例化一个类的时候第一个自动调用的方法.当实例化一个类时,最先被调用的方法 其实 ...

  9. mysqlreport工具

    进行MySQL的配置优化,首先必须找出MySQL的性能瓶颈所在:而SHOW STATUS输出的报告正是用来计算性能瓶颈的参考数据.mysqlreport不像SHOW STATUS那样简单的罗列数据,而 ...

  10. C#中类为什么要实例化

    在使用C#语言时,发现一下有关类实例化的问题,在此之前先复习一下类和对象的概念,类是一个抽象体,是对一类事物的抽象体:而对象就是一个具体的事物,对象的抽象就是类.车就是一个类,而车包括面包车,小汽车, ...