XPath定位操作返回节点列表
- 格式:doc
- 大小:55.50 KB
- 文档页数:2
py xpath用法XPath(XML Path Language)是一种用于在XML文档中定位节点的语言。
在Python中,我们可以使用lxml库来使用XPath来解析和定位XML文档中的节点。
首先,我们需要安装lxml库。
可以使用pip命令来安装lxml 库:pip install lxml.一旦安装了lxml库,我们就可以开始使用XPath来解析XML文档。
下面是一个简单的例子来说明如何使用XPath:python.from lxml import etree.# 假设我们有一个XML文档如下:# <bookstore>。
# <book category="COOKING">。
# <title lang="en">Everyday Italian</title>。
# <author>Giada De Laurentiis</author>。
# <year>2005</year>。
# <price>30.00</price>。
# </book>。
# <book category="CHILDREN">。
# <title lang="en">Harry Potter</title>。
# <author>J.K. Rowling</author>。
# <year>2005</year>。
# <price>29.99</price>。
# </book>。
# </bookstore>。
# 解析XML文档。
tree = etree.parse('books.xml')。
xpath定位⼤全写在之前,每次⾃⼰通过xpath定位的时候,在⽹上找的不是很全,所以想⾃⼰写⼀个相对⽐较全的,⽅便查阅;如果写的不好或者不⾜的,请指正,谢谢!xpath定位分为绝对路径和相对路径⼀:绝对路径绝对路径是指⽬录下的绝对位置,直接到达⽬标位置,通常是从盘符开始的路径,以百度⾸页为例,查询输⼊框的定位,xpath=/html/body/div/div/div/div/div/form/span/input或者xpath=/html/body/div[2]/div[2]/div[5]/div/div/form/span/input,根据该位置在HTML底下的层级关系,⼀层⼀层找下来,如果遇到div等重复较多,可以数该标签的顺序,以便提⾼定位的精度⼆:相对路径相对路径就是指由这个⽂件所在的路径引起的跟其它⽂件(或⽂件夹)的路径关系,如xpath=//div[@class='main-logo'],相⽐绝对路径,相对路径更容易定位到对应的位置且写法简单,也不⽤担⼼元素的位置变化⽽调整定位;相对路径定位⽅式有哪⼀些:A.直接定位标签//input #//标识定位到某⼀个标签,//*则代表所有标签,//input则定位所有input标签B.标签+属性匹配//input[@id='kw'] 或者//input[@type='text'] #由⼀个标签+某⼀个属性的组合 ,其中@代表匹配属性名称,相当于匹配所有的input标签并匹配属性id=kw的元素C.标签和多个属性//input[@id='kw' and @type='text'] #由⼀个标签+多个属性的组合,相当于匹配了所有的input标签并匹配属性id=kw且属性type=text的元素//input[@id='kw' or @type='text'] #由⼀个标签+多个属性的组合,相当于匹配了所有的input标签,并匹配属性id=kw或者属性type=text的元素D.⽗⼦定位//form[@id="form"]/input #相当于先定位到了⽗节点,再找到对应的⼦节点,常⽤语当前元素不易定位⽽⽗节点较易定位的情况E.contains//input[contains(@id,'w')] #相当于匹配了所有的input标签且id属性包含字符串"w"的元素 (模糊定位)//a[contains(text(),'新闻')] #相当于匹配了所有的input标签且⽂本包含"新闻" (模糊定位)F.start-with和ends-with//input[starts-with(@id,'k')] #相当于匹配了所有的input标签且属性id以字母k开头的元素 (模糊定位)//input[ends-with(@id,'w')] #相当于匹配了所有的input标签且属性id以字母w结尾的元素 (模糊定位)G.⽂本定位//a[text()='新闻'] #精准定位到本⽂属性,contains则是模糊定位H.关系定位⽅式(通过⼦节点找⽗节点、爷节点;兄弟节点或者堂兄弟等等)1.⼦节点找⽗节点//input[@id="kw"]/.. #相当于我们精确定位到了查询输⼊框,然后找他的⽗节点,往回⾛⼀层(根据层级关系)//input[@id="kw"]/parent::span2.兄弟节点//input[@id="kw"]/../span #相当于找到了⽗节点再往下找⼦节点(兄弟节点)//input[@id="kw"]/following-sibling::a #往下找兄弟节点,也可以写//input[@id="kw"]/following-sibling::a[1],定位到后⾯的第⼏个a标签//input[@id="kw"]/preceding-sibling::span #往上找兄弟节点,也可以写//input[@id="kw"]/preceding-sibling::span[1],定位到前⾯的第⼏个span标签同理可以找到相关的爷爷节点,堂兄弟节点等等。
xpath 方法(原创版2篇)目录(篇1)1.XPath 简介2.XPath 的应用场景3.XPath 的基本语法4.XPath 函数5.XPath 的优势与局限性正文(篇1)一、XPath 简介XPath 是一种在 XML 文档中进行节点和属性查找的语言,它可以用来提取和操作 XML 数据。
XPath 本质上是一种路径表达式,用于表示 XML 文档中的节点和属性。
通过 XPath,我们可以在 XML 文档中快速准确地定位到所需的节点和属性,从而简化了 XML 数据的处理和操作。
二、XPath 的应用场景XPath 广泛应用于以下场景:1.数据提取:从 XML 文档中提取特定的节点和属性。
2.数据过滤:根据特定条件筛选 XML 文档中的节点和属性。
3.数据排序:对 XML 文档中的节点和属性进行排序。
4.数据修改:修改 XML 文档中的节点和属性。
三、XPath 的基本语法XPath 的基本语法包括以下几个部分:1.轴:表示节点之间的关系,包括根节点(root)、父节点(parent)、子节点(child)、同级节点(sibling)等。
2.节点类型:表示节点的类型,包括元素(element)、属性(attribute)、文本(text)、评论(comment)等。
3.运算符:用于连接路径表达式,包括斜杠(/)、双点(..)、单点(.)等。
4.函数:用于进行复杂的数据操作,如求和、求积等。
以下是一个简单的 XPath 表达式示例:```//root/element[attribute=value]/child```四、XPath 函数XPath 提供了丰富的函数来处理和操作 XML 数据,包括:1.节点操作函数:如 count、length、first、last 等。
2.属性操作函数:如 get-attribute、setAttribute 等。
3.字符串操作函数:如 substring、substring-after、substring-before 等。
xpath——⽗⼦、兄弟、相邻节点定位⽅式详解转载最后发布于2019-06-15 20:47:17 阅读数 1215 收藏1. 由⽗节点定位⼦节点最简单的肯定就是由⽗节点定位⼦节点了,我们有很多⽅法可以定位,下⾯上个例⼦:对以下代码:1.<html>2.<body>3.<div id="A">4.<!--⽗节点定位⼦节点-->5.<div id="B">6.<div>parent to child</div>7.</div>8.</div>9.</body>10.</html>1想要根据 B节点定位⽆id的⼦节点,代码⽰例如下:1.# -*- coding: utf-8 -*-2.from selenium import webdriver3.4.driver = webdriver.Firefox()5.driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')6.7.# 1.串联寻找8.print driver.find_element_by_id('B').find_element_by_tag_name('div').text9.10.# 2.xpath⽗⼦关系寻找11.print driver.find_element_by_xpath("//div[@id='B']/div").text12.13.# 3.css selector⽗⼦关系寻找14.print driver.find_element_by_css_selector('div#B>div').text15.16.# 4.css selector nth-child17.print driver.find_element_by_css_selector('div#B div:nth-child(1)').text18.19.# 5.css selector nth-of-type20.print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text21.22.# 6.xpath轴 child23.print driver.find_element_by_xpath("//div[@id='B']/child::div").text24.25.driver.quit()1结果:1.parent to child2.parent to child3.parent to child4.parent to child5.parent to child6.parent to child1第1到第3都是我们熟悉的⽅法,便不再多⾔。
xpath语法简介有多种方式可以从网页中提取我们需要的信息,既可以通过正则表达式,也可以使用BeautifulSoup模块。
除此之外,xpath表达式也是一种常见用法。
xpath称之为xml路径语言,是一种基于xml的树状结构,来提取特定元素的语言。
在python中,最常见的是通过lxml模块来使用xpath, 基本用法如下>>> from lxml import etree>>> html = etree.parse("K00001.html", etree.HTMLParser()) >>> html.xpath('/html')在xml的树状结构中,根节点用/表示,所有的元素都可以作为子节点存在。
和linux文件树中相对和绝对定位类似,在xpath中,也有两种定位的写法1. 绝对定位,用/表示,选取路径树中直接相连的子节点2. 相对定位,用//表示,表示路径树中所有的子孙节点同时,一个点号表示当前节点,两个点号表示当前节点父节点的简写方式在xpath中也是适用的。
按照以上原则,就可以快速的写出最基础的路径表达式了,以下三种写法是等价的#从根节点开始,依次指定路径>>> html.xpath('/html/head/title')[<Element title at 0x7f3795bd1d48>]#利用//符号,得到属于html标签孙节点的title标签>>> html.xpath('/html//title')[<Element title at 0x7f3795bd1d48>]#直接用//符号,捕获title标签>>> html.xpath('//title')[<Element title at 0x7f3795bd1d48>]在基础路径的基础上,我们可以通过一些筛选手段进一步对子节点进行限制。
python定位xpath节点位置的⽅法chrome 右键有copy xpath地址但是有些时候获取的可能不对可以⾃⼰⽤代码验证⼀下如果还是不⾏可以考虑从源码当中取出来趁热打铁,使⽤前⼀篇⽂章中 XPath 节点来定位HTML 页⾯。
HTML⽂件如下(您可以将其拷贝,保存成html⽂件,跟我笔者实验):<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Storm</title></head><body><h1 id="h1" name="hname" class="cname">这是⼀个h1标签</h1><form>⽂本域1:<input type="text" name="first_name"><br>⽂本域2:<input type="text" name="last_name"></form><form>密码字段:<input type="password" name="password"></form><form>单选按钮1:<input type="radio" name="radio1" value="nan">male<input type="radio" name="radio1" value="nv">female</form><form>宠物:<input type="checkbox" name="cw">猫<input type="checkbox" name="cw">狗<input type="checkbox" name="cw">兔⼦</form></body></html>1、节点上⾯的HTML⽂件,<html> 为根节点,他有个lang的属性,他有两个⼦节点<head>和<body>。
python xpath matches使用方法在Python中,可以使用lxml库来解析和操作XML文档,并使用XPath语法进行节点定位和匹配。
下面是使用Python中的lxml库的XPath的基本用法:```pythonfrom lxml import etree# 创建XML文档树xml = '<root><foo>hello</foo><bar>world</bar></root>'tree = etree.XML(xml)# 使用XPath选择节点result = tree.xpath('//foo') # 选择所有名称为"foo"的节点print(result) # 输出: [<Element foo at 0x7f4179f63cc8>]# 获取节点的文本内容text = result[0].textprint(text) # 输出: hello# 使用XPath选择多个节点result = tree.xpath('//foo | //bar') # 选择名称为"foo"的节点和名称为"bar"的节点print(result) # 输出: [<Element foo at 0x7f4179f63cc8>,<Element bar at 0x7f417b9e7b08>]# 使用属性进行节点选择result = tree.xpath('//foo[@attr="value"]') # 选择名称为"foo"且具有attr属性值为"value"的节点print(result) # 输出: []# 使用通配符选择节点result = tree.xpath('//*[@attr="value"]') # 选择具有attr属性值为"value"的任意节点print(result) # 输出: []# 获取节点的父节点parent = result[0].getparent()print(parent.tag) # 输出: root```这只是XPath在Python中的基本使用方法,可以根据具体的需求来进行更复杂和灵活的节点选择和操作。
pythonseleniumxpath定位操作xpath是⼀种在xm⽂档中定位的语⾔,详细简介,请⾃⾏参照百度百科,本⽂主要总结⼀下xpath的使⽤⽅法,个⼈看法,如有不⾜和错误,敬请指出。
注意:xpath的定位同⼀级别的多个标签索引从1开始⽽不是01. 绝对定位:此⽅法最为简单,具体格式为xxx.find_element_by_xpath("绝对路径")具体例⼦:xxx.find_element_by_xpath("/html/body/div[x]/form/input") x 代表第x个 div标签,注意,索引从1开始⽽不是0此⽅法缺点显⽽易见,当页⾯元素位置发⽣改变时,都需要修改,因此,并不推荐使⽤。
2.相对路径:相对路径,以‘//'开头,具体格式为xxx.find_element_by_xpath("//标签")具体例⼦:xxx.find_element_by_xpath("//input[x]") 定位第x个input标签,[x]可以省略,默认为第⼀个相对路径的长度和开始位置并不受限制,也可以采取以下⽅法xxx.find_element_by_xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"3.标签属性定位:3.1标签属性定位,相对⽐较简单,也要求属性能够定位到唯⼀⼀个元素,如果存在多个相同条件的标签,默认只是第⼀个,具体格式xxx.find_element_by_xpath("//标签[@属性==‘属性值']")属性判断条件:最常见为id,name,class等等,⽬前属性的类别没有特殊限制,只要能够唯⼀标识⼀个元素都是可以的具体例⼦xxx.find_element_by_xpath("//a[@href='/industryMall/hall/industryIndex.ht']") xxx.find_element_by_xpath("//input[@value='确定']")xxx.find_element_by_xpath("//div[@class = 'submit']/input")当某个属性不⾜以唯⼀区别某⼀个元素时,也可以采取多个条件组合的⽅式,具体例⼦xxx..find_element_by_xpath("//input[@type='name' and @name='kw1']")3.2 当标签属性很少,不⾜以唯⼀区别元素时,但是标签中间中间存在唯⼀的⽂本值,也可以定位,其具体格式xxx.find_element_by_xpath("//标签[contains(text(),'⽂本值')]")具体例⼦:xxx.find_element_by_xpath("//iunpt[contains(text(),'型号:')]")注意:尽量在html中复制此段⽂本,避免因为⾁眼⽆法分辨的字符导致定位失败3.3 其他的属性值如果太长,也可以采取模糊⽅法定位,直接上⽰例xxx.find_element_by_xpath(“//a[contains(@href, ‘logout')]”)3.4 XPath 关于⽹页中的动态属性的定位,例如,应⽤程序中动态⽣成id属性值,可以有以下四种⽅法:a.starts-with例⼦: input[starts-with(@id,'ctrl')] 解析:匹配以ctrl开始的属性值b.ends-with 例⼦:input[ends-with(@id,'_userName')] 解析:匹配以userName结尾的属性值c.contains() 例⼦:Input[contains(@id,'userName')] 解析:匹配含有userName属性值当然,如果上⾯的单⼀⽅法不能完成定位,也可以采取组合式定位类似("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])以上是普通的情况,存在可以定位的属性,当某个元素的各个属性及其组合都不⾜以定位时,我们可以利⽤其兄弟节点或者⽗节点等各种可以定位的元素进⾏定位,先看看xpath中⽀持的⽅法:1、child 选取当前节点的所有⼦元素2、parent 选取当前节点的⽗节点3、descendant选取当前节点的所有后代元素(⼦、孙等)4、ancestor 选取当前节点的所有先辈(⽗、祖⽗等)5、descendant-or-self选取当前节点的所有后代元素(⼦、孙等)以及当前节点本⾝6、ancestor-or-self 选取当前节点的所有先辈(⽗、祖⽗等)以及当前节点本⾝7、preceding-sibling选取当前节点之前的所有同级节点8、following-sibling选取当前节点之后的所有同级节点9、preceding选取⽂档中当前节点的开始标签之前的所有节点10、following选取⽂档中当前节点的结束标签之后的所有节点11、self 选取当前节点12、attribute 选取当前节点的所有属性13、namespace选取当前节点的所有命名空间节点上图实例,需要点击订单号为17051915200001的发货按钮,这时候不能直接定位到发货按钮,⽽是先要定位到订单号元素,再定位他的兄弟节点。
Python爬⾍之Xpath语法XPath 是⼀门在 XML ⽂档中查找信息的语⾔。
XPath ⽤于在 XML ⽂档中通过元素和属性进⾏导航。
XPath 含有超过 100 个内建的函数。
这些函数⽤于字符串值、数值、⽇期和时间⽐较、节点和 QName 处理、序列处理、逻辑值等等。
XPath 是 W3C 标准,XPath 于 1999 年 11 ⽉ 16 ⽇成为 W3C 标准。
XPath 被设计为供 XSLT、XPointer 以及其他 XML 解析软件使⽤。
在XPath 中,有七种类型的节点:元素、属性、⽂本、命名空间、处理指令、注释以及⽂档节点(或称为根节点)。
XML ⽂档是被作为节点树来对待的。
树的根被称为⽂档节点或者根节点。
⼀、选取节点常⽤的路径表达式:表达式描述实例nodename选取nodename节点的所有⼦节点xpath(‘//div’)选取了div节点的所有⼦节点/从根节点选取xpath(‘/div’)从根节点上选取div节点xpath(‘//div’)选取所有的div节点//选取所有的当前节点,不考虑他们的位置.选取当前节点xpath(‘./div’)选取当前节点下的div节点..选取当前节点的⽗节点xpath(‘..’)回到上⼀个节点@选取属性xpath(’//@calss’)选取所有的class属性⼆、谓词:被嵌在⽅括号内,⽤来查找某个特定的节点或包含某个制定的值的节点表达式结果xpath(‘/body/div[1]’)选取body下的第⼀个div节点xpath(‘/body/div[last()]’)选取body下最后⼀个div节点xpath(‘/body/div[last()-1]’)选取body下倒数第⼆个div节点xpath(‘/body/div[positon()<3]’)选取body下前两个div节点xpath(‘/body/div[@class]’)选取body下带有class属性的div节点xpath(‘/body/div[@class=”main”]’)选取body下class属性为main的div节点xpath(‘/body/div[price>35.00]’)选取body下price元素值⼤于35的div节点三、通配符:Xpath通过通配符来选取未知的XML元素表达式结果xpath(’/div/*’)选取div下的所有⼦节点xpath(‘/div[@*]’)选取所有带属性的div节点四、取多个路径:使⽤“ | 运算符可以选取多个路径表达式结果xpath(‘//div|//table’)选取所有的div和table节点五、Xpath轴:轴可以定义相对于当前节点的节点集轴名称表达式描述ancestor xpath(‘./ancestor::*’)选取当前节点的所有先辈节点(⽗、祖⽗)ancestor-or-self xpath(‘./ancestor-or-self::*’)选取当前节点的所有先辈节点以及节点本⾝attribute xpath(‘./attribute::*’)选取当前节点的所有属性child xpath(‘./child::*’)返回当前节点的所有⼦节点descendant xpath(‘./descendant::*’)返回当前节点的所有后代节点(⼦节点、孙节点)following xpath(‘./following::*’)选取⽂档中当前节点结束标签后的所有节点following-xpath(‘./following-sibing::*’)选取当前节点之后的兄弟节点sibingparent xpath(‘./parent::*’)选取当前节点的⽗节点preceding xpath(‘./preceding::*’)选取⽂档中当前节点开始标签前的所有节点preceding xpath(‘./preceding::*’)点preceding-sibling xpath(‘./preceding-sibling::*’)选取当前节点之前的兄弟节点self xpath(‘./self::*’)选取当前节点六、功能函数:使⽤功能函数能够更好的进⾏模糊搜索函数⽤法解释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”) andcontains(@id,”in”)]‘)选取id值包含ma和in的div节点text()xpath(‘//div[contains(text(),”ma”)]‘)选取节点⽂本包含ma的div节点七、常⽤函数:1、精确定位(1)contains(str1,str2)⽤来判断str1是否包含str2例1://*[contains(@class,'c-summaryc-row ')]选择@class值中包含c-summary c-row的节点例2://div[contains(.//text(),'价格')]选择text()中包含价格的div节点(2)position()选择当前的第⼏个节点例1://*[@class='result'][position()=1]选择@class='result'的第⼀个节点例2://*[@class='result'][position()<=2]选择@class='result'的前两个节点(3)last()选择当前的倒数第⼏个节点例1://*[@class='result'][last()]选择@class='result'的最后⼀个节点例2://*[@class='result'][last()-1]选择@class='result'的倒数第⼆个节点(4)following-sibling 选取当前节点之后的所有同级节点例1://div[@class='result']/following-sibling::div选择@class='result'的div节点后所有同级div节点找到多个节点时可通过position确定第⼏个如://div[@class='result']/following-sibling::div[position()=1](5)preceding-sibling 选取当前节点之前的所有同级节点使⽤⽅法同following-sibling2、过滤信息(1)substring-before(str1,str2)⽤于返回字符串str1中位于第⼀个str2之前的部分例⼦:substring-before(.//*[@class='c-more_link']/text(),'条')返回.//*[@class='c-more_link']/text()中第⼀个'条'前⾯的部分,如果不存在'条',则返回空值(2)substring-after(str1,str2)跟substring-before类似,返回字符串str1中位于第⼀个str2之后的部分例1:substring-after(.//*[@class='c-more_link']/text(),'条')返回.//*[@class='c-more_link']/text()中第⼀个’条’后⾯的部分,如果不存在'条',则返回空值例2:substring-after(substring-before(.//*[@class='c-more_link']/text(),'新闻'),'条')返回.//*[@class='c-more_link']/text()中第⼀个'新闻'前⾯与第⼀个'条'后⾯之间的部分(3)normalize-space()⽤来将⼀个字符串的头部和尾部的空⽩字符删除,如果字符串中间含有多个连续的空⽩字符,将⽤⼀个空格来代替例⼦:normalize-space(.//*[contains(@class,'c-summaryc-row ')])(4)translate(string,str1,str2)假如string中的字符在str1中有出现,那么替换为str1对应str2的同⼀位置的字符,假如str2这个位置取不到字符则删除string的该字符例⼦:translate('12:30','03','54')结果:'12:45'3、拼接信息(1)concat()函数⽤于串连多个字符串例⼦:concat('',.//*[@class='c-more_link']/@href)。
XML认证教程:XPATH用XPath精确定位节点元素在利用XSL进行转换的过程中,匹配的概念非常重要。
在模板声明语句xsl:template match = ""和模板应用语句xsl:apply-templates select = "" 中,用引号括起来的部分必须能够精确地定位节点。
具体的定位方法则在XPath中给出。
之所以要在XSL中引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。
可以把XPath比作文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点,显然这对XSLT 来说是一个最最基本的功能。
XPath数据类型XPath可分为四种数据类型:节点集(node-set)节点集是通过路径匹配返回的符合条件的一组节点的集合。
其它类型的数据不能转换为节点集。
布尔值(boolean)由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和 false两个值。
布尔值可以和数值类型、字符串类型相互转换。
字符串(string)字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。
字符串可与数值类型、布尔值类型的数据相互转换。
数值(number)在XPath中数值为浮点数,可以是双精度64位浮点数。
另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无穷大-infinity、正负0等等。
number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。
其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。
XPath节点类型另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。