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. Cannon

    Description In Chinese Chess, there is one kind of powerful chessmen called Cannon. It can move hori ...

  2. localtime、localtime_s、localtime_r的使用

    (1).localtime用来获取系统时间,精度为秒 #include <stdio.h>#include <time.h>int main(){    time_t time ...

  3. JAVA-JSP声明语句

    相关资料: <21天学通Java Web开发> 结果总结: 1.<%! %>声明的变量为全局变量. 实例代码: <html> <head> <ti ...

  4. DHCP配置实例

    配置DHCP的思路: 1.创建dhcp服务2.添加一个网络号(或者说地址池)3.排除路由器的网管4.排除DHCP的网关 代码: Router>enableRouter#configRouter# ...

  5. Lo4j(一)初识

    最近开始在研究log4j,可能因为是想要自己去搭建框架那. 废话不多说,先上一个例子好了. 第一步:当然是引入对象的jar包了 地址:http://www.apache.org/dyn/closer. ...

  6. 【WPF】弹窗定位、弹窗关闭后再打开的报错

    需求:点击按钮,打开一个弹窗. // 获得窗体实例 Window window = openDesignViewModel.View as Window; // 这是使用了WAF框架 //Window ...

  7. uboot中bootargs实现

    setup.h通过宏定义实现了bootargs传递参数到内核,值得以后编程学习. include/asm-arm/setup.h 14  * NOTE: 15  *  This file contai ...

  8. 关于BETA、RC、ALPHA、Release、GA等版本号的意义

    关于BETA.RC.ALPHA.Release.GA等版本号的意义 转载 2016年06月19日 00:04:00 2049 0 1 . 最近由于工作需要经常要去SVN上拉开源项目的源码,对项目 ...

  9. rails下mysql出错问题mysql_api,blog/text

    问题一:提示出错:cannot load such file -- mysql/mysql_api (LoadError) 此时我们回来看gem install mysql 时提示 At the ti ...

  10. 数据库 proc编程九

    第一种动态sql EXEC SQL EXECUTE IMMEDIATE :psql; .仅适用于非select语句 .嵌入SQL语句中不能包含输入宿主变量 void main() { EXEC SQL ...