xpath怎么用

大家在写爬虫时,往往获取到网页之后,需要从网页中提取我们需要的信息。这时候就需要用到xpath或者css选择器来定位页面元素信息。但是,由于这两者都是非人性化的语法,导致好多人望而生畏,经常为这个发愁

大家在写爬虫时,往往获取到网页之后,需要从网页中提取我们需要的信息。这时候就需要用到 xpath 或者 css 选择器来定位页面元素信息。但是,由于这两者都是非人性化的语法,导致好多人望而生畏,经常为这个发愁。

今天我就尝试用一篇文章来道尽 xpath 解析 HTML 的方方面面,希望大家看完这篇文章后,从此不再害怕 xpath 解析。

路径表达式

nodename:选取此节点的所有子节点

先贴一个lxml的简单框架:其中,最主要的在于xpath路径的获取和解析,而XPath就是地址,具体地,就是需要知道所要寻找的内容处在哪个地址下。一般而言,我们可以根据开发者工具来定位我们需要的元素,然后右击选择其所在xpath,。

从当前节点选取直接子节点

从当前接点选取子孙节点

.:选取当前节点

..:选取当前接点的父节点

@:选取属性

我们先放上一段 HTML 代码:

<html><head><title>Xpath test page</title></head><body><div class=&34;><span class=&34;><a href=&34;group&34;navli&34;nav_tit&34;;>新闻频道</a></span></div><div class=&34;><span class=&34;><a href=";>体育频道</a></span></div></body></html>

接下来,我们针对这段 HTML 代码来进行 xpath 解析。

要进行 xpath 解析,我们先要将 HTML 文本转化成对象:

from lxml import etreetext = &39;&39;ultest&34;item-0&34;link1.html&34;item-1&34;link2.html&34;item-inactive&34;link3.html&34;item-1&34;link4.html&34;item-0&34;link5.html& 注意,此处缺少一个 </li> 闭合标签 </ul> </div>&39;& 调用HTML类进行初始化,这样就成功构造了一个XPath解析对象。page = etree.HTML(text)print(type(page))

我们可以看到打印的结果:

<class &39;>

nodename

xpath怎么用

nodename 表示根据标签名字选取标签,注意只会选择子标签!比如:如果是儿子的儿子则选取不到。

print(page.xpath(&34;))//[<Element body at 0x1966d1c48c0>]print(page.xpath(&34;))// []

这个 nodename 我有点不是太清楚,当我使用 body 时,可以找到出 body 节点元素,但是使用 ul 时,找不到 ul 节点元素,打印的是空。这个网上搜索也没有什么准确的答案,如果你知道这里面的原理,还请告诉我。

表示从根节点选取一级一级筛选(不能跳)。

print(page.xpath(&34;))// [<Element html at 0x27107f41100>]print(page.xpath(&34;))// []

可以看到,我选取根节点 html ,可以打印出根节点元素,而我选取 body 打印时,是找不到的,这个符号只能从根节点开始找。

表示从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。注意:是所有符合条件的。

print(page.xpath(&34;))// [<Element li at 0x1cd2a325780>,<Element li at 0x1cd2a325840>,<Element li at 0x1cd2a3259c0>,<Element li at 0x1cd2a325b00>,<Element li at 0x1cd2a325ac0>]

.

. 表示选取当前标签。

ul = page.xpath(&34;)print(ul)print(ul[0].xpath(&34;))print(ul[0].xpath(&34;))// [<Element ul at 0x1cd2a325840>]// [<Element ul at 0x1cd2a325840>]// [<Element li at 0x1cd2a325700>,<Element li at 0x1cd2a325b00>,<Element li at 0x1cd2a325640>,<Element li at 0x1cd2a325ac0>,<Element li at 0x1cd2a325c00>]

我们先定位到 ul 元素节点,这里的结果是一个列表,然后再打印当前节点列表的第一个 ul,接着我们打印这个 ul 节点的子节点 li。

..

.. 表示选取当前标签的父节点。

print(ul[0].xpath(&34;))// [<Element div at 0x1cd2a325b00>]

这里打印第一个 ul 节点的父元素,也就是 div 。

@

@ 表示获取标签的属性值。

print(ul[0].xpath(&34;))// [&39;]

我们打印第一个 ul 节点的 id 属性,可以看到结果是 ‘ultest’。

谓语

谓语用来查找某个或某些特定的节点或者包含某个指定值的节点。谓语被嵌在方括号中。

/a[n] n为大于零的整数,代表子元素排在第n个位置的<a>元素//a[last()] last()代表子元素排在最后个位置的<a>元素//a[last()-]和上面同理,代表倒数第二个//a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始//a[@href]拥有href的<a>元素//a[@href=&39;]href属性值为&39;的<a>元素//book[@price>2]price值大于2的<book>元素

同样的,我们来举一些例子:

获取文本

text()

我们用text()获取某个节点下的文本:

print(page.xpath(&39;))// [&39;,&39;,&39;,&39;,&39;]

string()

我们用string()获取某个节点下所有的文本:

print(page.xpath(&39;))

输出内容为:

通配符

* 任意元素

@* 任意属性

* 表示匹配任何元素节点:

print(page.xpath(&39;))// [<Element a at 0x208931f0f00>,<Element a at 0x208931f0f40>,<Element a at 0x208931f0c40>,<Element a at 0x208931f0d80>,<Element a at 0x208931ff080>]

@* 表示匹配任何属性节点:

print(page.xpath(&39;))// [&39;,&39;,&39;,&39;,&39;]

或运算

通过在路径表达式中使用&34;运算符,可以实现选取若干个路径。

34;//li|//a"))// [<Element li at 0x29bb7190ac0>,<Element a at 0x29bb7190b00>,<Element li at 0x29bb7190f00>,<Element a at 0x29bb7190dc0>,<Element li at 0x29bb7190fc0>,<Element a at 0x29bb7190e00>,<Element li at 0x29bb7190f80>,<Element a at 0x29bb71b1080>,<Element li at 0x29bb71b1040>,<Element a at 0x29bb7190cc0>]

函数

因为每个标签都是各自父元素的最后一个元素。#本来每个li就只有一个子元素,所以都是最后一个print(html.xpath("//li/a[last()]/text()"))print(html.xpath("//li/a[contains(text(),'third')]")) 【结果为。

xpath内置很多函数。更多函数查看。

contains(string1,string2)

starts-with(string1,string2)

text()

last()

position()

node()

contains

有的时候,class作为选择条件的时候不合适@class=&39; 这个是完全匹配,当网页样式发生变化时,class或许会增加或减少像active的class。用contains就能很方便。

starts-with

print(page.xpath(&39;item-inactive&34;))// [<Element li at 0x1a297641d00>]

XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。下面列出了最有用的路径表达式:在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:谓语用来查找某个特定的节点或者包含某个指定。

其他几个函数,我们在上面使用过。注意,并不是所有的 xpath 函数python都会支持,比如 ends-with(string1,string2) 和 upper-case(string) 就不支持。

节点轴选择

ancestor轴

调用 ancestor 轴,获取所有祖先节点。其后需要跟两个冒号,然后是节点的选择器。返回结果:第一个li节点的所有祖先节点。

print(page.xpath(&39;))// [<Element html at 0x26ead5d2d40>,<Element body at 0x26eae63fdc0>,<Element div at 0x26eae628c00>,<Element ul at 0x26eae63fd40>]

attribute轴

调用 attribute 轴,获取所有属性值。返回结果:li节点的所有属性值。

print(page.xpath(&39;))// [&39;]

child轴

调用 child 轴,获取所有直接子节点。返回结果:选取 href 属性为 link1.html 的 a 子节点。

print(page.xpath(&34;link1.html&39;))// [<Element a at 0x13972af5b40>]

descendant轴

调用 descendant 轴,获取所有子孙节点。同时加了限定条件。返回结果:选取 li 节点下的子孙节点里的 span 节点。

print(page.xpath(&39;))// [<Element span at 0x1a4d5700d00>]

following轴

XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中。

调用 following 轴,获取当前节点之后的所有节点。

print(page.xpath(&39;))// [<Element a at 0x1583f8c0d00>]

following-sibling轴

调用 following-sibling 轴,获取当前节点之后的所有同级节点。

总结

到这里,我们的 xpath 学习之路就结束了,文章中基本涵盖了大家需要用的的 xpath 解析方法。大家看一遍没记住不要紧,以后遇到此类解析直接搬出这篇文章对照着写就行。

上一篇 2023年03月04 19:57
下一篇 2023年02月20 02:31

相关推荐

  • ps怎么倒角,ps图片怎么倒角

    说到新房装修铺瓷砖,在铺设进行倒角工艺的时候,会不会觉得瓷砖倒角工序会收取高额的手工费用,其实,ps图片怎么倒角,这种想法是有道理的,因为在泥工人员的工资中,这是最昂贵的手工流程费用。事实上,我们在装

    2023年01月19 284
  • 王子烟多少钱一包,王子烟价格图片大全集

    如今各省的香烟都已经进行了整合,王子烟价格图片大全集,很多老的香烟品牌都消失了,烟厂所剩也不多,基本上只有1-2个品牌了。那四川在上世纪8090年代有什么老牌的香烟呢?下面让我们看看,有没有你抽过的呢

    2023年03月14 221
  • 一条烟多少钱,150到200元一条的烟有哪些

    白沙烟是湖南的名烟,该香烟的名字来源于长沙南门城外山下的白沙井。白沙烟品种繁多,有10元、20元的低档烟,比如精品白沙一代、二代和三代;也有50元、上百元的中高档烟,150到200元一条的烟有哪些,比

    2023年02月20 247
  • 50克是多少,50克的参照物图片

    单元重点知识归纳认识克及用天平称量物体的质量平时我们常说的物品有多重,实际是指物品的质量是多少。50克的参照物图片,现在为了和国外方便买卖,世界各国都统一用“克”和“千克”,作为质量单位,而我国则从1

    2023年02月24 245
  • 海尔怎么样,海尔集团工作稳定吗

    如今市场空调口碑最好的也就只有格力、美的、海尔了,有次有幸跟卖家电的朋友说起空调,海尔集团工作稳定吗,就说切记一点就不会上当,不要买市场的特价空调,特价空调不管是从性能、质量到耗电都是最差的,那么从细

    2023年02月08 232
  • 迎春多少钱,迎春6元一包香烟

    高贵典雅的蝴蝶兰,花团锦簇的仙客来,顶开红花的鸿运当头……随着春节临近,花卉市场的“年味”也渐渐浓了起来。走进襄垣县古韩镇北里信村鑫龙花卉大棚内,各色花卉映入眼帘,迎春6元一包香烟,空气里弥漫着阵阵花

    2023年02月28 224
  • 屏幕碎了要多少钱,修屏幕需要多少元

    华为mate40pro换屏幕多少钱mate40pro官方换屏价格近日网上就有用户发生了悲剧,达成了华为mate40pro屏幕首碎成就,那么华为mate40pro屏幕碎了换个屏幕需要多少钱呢,修屏幕需要

    2023年03月02 280
  • 窗帘怎么画,窗帘手绘怎么画

    在Revit的室内精装中,窗帘手绘怎么画,通常要绘制窗帘盒构件。用常规模型做,每次载入的时候都要设置一下窗帘盒长度,今天来为大家介绍一种快速绘制窗帘盒的方法。1.打开revit,新建族-基于线的常规模

    2023年02月11 217
  • 航嘉电源怎么样,电源选长城还是航嘉

    在RTX30系显卡和12代酷睿相继登场后,不少玩家已经发现新一代平台对于电源功耗的要求越来越高了,传统500W左右功率的电源已经难以满足高端用户的需求,700W以上的大功率电源逐渐进入大部分玩家的视野

    2023年02月05 279
  • 机械键盘灯光怎么开

    1外观细节雷柏MT510机械键盘采用了简约风格设计,磨砂质感金属外壳,以及切边设计的边缘,令手部放置的时候更加舒适,也与之前出品的MT510PRO版本相同。这把键盘采用了84键配列,整体尺寸约为310

    2023年02月01 228
  • 海韵电源怎么样

    新一代ATX3.0电源——海韵VERTEX峰睿GX-1000开箱小测前言好了废话不多说,还是整理了一下海韵这颗使用全新架构与制程设计、为新时代PC提供更可靠稳定解决方案的VERTEX系列的产品特性:1

    2023年02月06 262
  • 胶带怎么做,一秒做100个盲袋

    日常生活里,胶带是办公桌上的必备文具;在艺术世界里,胶带也多被当作工具使用,鲜少作为自我表达的媒介。然而1989年,美国罗德岛街头出现了第一件以胶带取代喷漆完成的涂鸦创作,自此之后“胶带艺术”的这股风

    2023年02月09 201
  • 一粒米多少克,14亿人每人节约一粒米

    流言O型血最容易被蚊子叮真相蚊子最爱叮谁?“血型说”靠谱吗?确实,有少量研究文献认为,部分特定种类的蚊科昆虫对某些类型的血液会具有更为明显的趋性,例如某些种类的伊蚊更偏爱O型血。但需要注意的是,这些研

    2023年02月23 289
关注微信