XPath 简介:

(1) 前面我们爬取一个网页,都是使用正则表达式来提取想要的信息,但是这种方式比较复杂,一旦有一个地方写错,就匹配不出来了,因此我们可以使用 XPath 来进行提取
(2) XPath 即 XML Path Language,XML路径语言,起初是用来在 XML 文档中提取信息的,但同样适用于在 HTML 文档中提取信息,通过 XPath 来定位一个或多个HTML节点
(3) 什么是HTML节点:https://www.cnblogs.com/pzk7788/p/10530042.html ;在 Python 中,使用 lxml 库进行信息的提取,可以使用 pip3 install lxml 进行安装

XPath 规则:

// 用于提取指定的节点,如 //p 表示提取所有 <p> 节点
/  用于提取当前节点的子节点,如 //ul/li 表示提取 <ul> 下的 <li> 节点
.. 用于提取当前节点的父节点,如 //body/../html 表示提取 <body> 节点的上一层 <html> 节点
@ 用于提取属性,如 //a[@href] 表示提取 <a> 节点的 href 属性值

XPath 用法:

假设 index.html 内容如下,使用 XPath 提取我们想要的内容:

<div>
<ul>
<li class="item-1"><a href="link1.html">first item</a> </li>
<li class="item-2"><a href="link2.html">second item</a> </li>
<li class="item-3"><a href="link3.html">third item</a> </li>
<li class="item-4"><a href="link4.html">fourth item</a> </li>
<li class="item-5 id-6"><a href="link5.html">fifth item</a> </li>
</ul>
</div>
from lxml import etree

html = etree.parse('./index.html', etree.HTMLParser())   //etree.parse()用于加载本地文件,etree.HTMLParser() 是一个 HTML 解析器,用于解析 HTML 文件

result = html.xpath('//li')                              //提取所有<li>节点,结果为:[<Element li at 0x488030>, <Element li at 0x484fd0>, ......
result = html.xpath('//li/a') //提取所有 <li> 节点下的 <a> 节点,结果为:[<Element a at 0x3c28030>, <Element a at 0x3c24fd0>, ......
result = html.xpath('//li/a/text()') //提取所有 <li> 节点下的 <a> 节点的文本内容,结果为:['first item', 'second item', 'third item', 'fourth item', 'fifth item']
result = html.xpath('//li/a/@href') //提取所有 <li> 节点下的 <a> 节点的 href 属性值,结果为:['link1.html', 'link2.html', 'link3.html', 'link4.html', 'link5.html']
result = html.xpath('//li[1]/a/text()') //提取第一个出现的 <li> 节点,结果为:['first item']
result = html.xpath('//li[last()]/a/text()') //提取最后一个出现的 <li> 节点,结果为:['fifth item']
result = html.xpath('//li[last()-2]/a/text()') //提取倒数第三个出现的 <li> 节点,结果为:['third item']
result = html.xpath('//li[position()<3]/a/text()') //提取位置小于3的 <li> 节点,结果为:['first item', 'second item']
result = html.xpath('//a[@href="link4.html"]') //提取属性为 href="link4.html" 的 <a> 节点,结果为:[<Element a at 0x33b4fd0>]
result = html.xpath('//a[@href="link4.html"]/../@class') //提取属性为 href="link4.html" 的 <a> 节点的父节点,然后获取父节点的 class 属性,结果为:['item-4']
result = html.xpath('//li[1]/ancestor::*') //ancestor用于提取祖先节点,也就是提取第一个<li>节点上面的所有节点,结果为:[<Element html at 0x3738058>, <Element body at 0x3734fd0>, ......
result = html.xpath('//li[1]/ancestor::div') //ancestor用于提取祖先节点,这里表示提取第一个<li>节点上面的<div>节点,结果为:[<Element div at 0x3554fd0>]
result = html.xpath('//li[1]/attribute::*') //attribute用于提取节点的属性值,这里表示提取第一个<li>节点的所有属性值,结果为:['item-1']
result = html.xpath('//li[1]/child::*') //child用于提取指定节点下的所有子节点,这里表示提取第一个<li>节点下的所有子节点,结果为:[<Element a at 0xb58030>]
result = html.xpath('//li[contains(@class, "item") and contains(@class, "id")]') //在上面的最后一个 <li> 节点中,class属性有两个值,我们需要使用 contains 来进行模糊匹配,表示提取属性值包含 item 和 id 的节点

使用 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. Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...

  2. 设置将Maven的jar包发布到lib

    2,设置将Maven的jar包发布到lib下. Add -> Java Build Path Entries -> Maven Dependencies -> Finish 设置完成 ...

  3. java华为面试题

    JAVA方面 1 面向对象的特征有哪些方面 2 String是最基本的数据类型吗? 3 int 和 Integer 有什么区别 4 String 和StringBuffer的区别 5运行时异常与一般异 ...

  4. 基于jquery网站左侧下拉菜单

    网站左侧下拉菜单jQuery代码.这是一款蓝色风格的适合做后台下拉菜单代码.效果图如下: 在线预览   源码下载 实现的代码: <div class="container"& ...

  5. displaytag的Excel导出实践

    本文转自 http://lingceng.iteye.com/blog/1820081/ Displaytag官网有1.0, 1.1, 1.2等,注意找到对应的版本.源码和API可以在Maven库中找 ...

  6. 【C#】图像的变形/变换/扭曲。用Emgu或YLScsFreeTransform(FreeImageTransformation)或MagickImage

    需求:将图像变形,如矩形图片变换成梯形的,图素拉伸. 解决方案:目前找到有两种. 使用EmguCV,它是.Net版的OpenCV.推荐直接在VS里的Nuget中搜索EmguCV进行下载. 使用第三方库 ...

  7. java执行jar包

    一般运行包含manifest的jar包,可以使用 java -jar <jar-file-name>.jar 如果jar里没有 manifest,则可以使用 java -cp foo.ja ...

  8. Jqueruy验证 form表单提交之前的中的数据

    //---表单提交---- $("#destiation_form").submit(function(){ var from_city_value=$("#from_c ...

  9. r 数据分组处理

    一.R语言实现数据的分组求和 实验数据集 姓名,年龄,班级 ,成绩, 科目 student <- data.frame ( name = c("s1", "s2&q ...

  10. 软件测试工具MonkeyTalk使用方法

    1.简单介绍 MonkeyTalk软件测试工具由两部分构成:MonkeyTalk IDE 和 MonkeyTalk Agents MonkeyTalk IDE是Eclipse平台的工具,工能是:对iO ...