XPath定位操作返回节点列表
py xpath用法
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定位分为绝对路径和相对路径⼀:绝对路径绝对路径是指⽬录下的绝对位置,直接到达⽬标位置,通常是从盘符开始的路径,以百度⾸页为例,查询输⼊框的定位,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 方法
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——父子、兄弟、相邻节点定位方式详解
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语法简介
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节点位置的方法
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 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定位操作
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语法
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
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节点类型也是很必要的。
TinyXML(TinyXPath) 使用总结
原来的Windows 平台下的项目使用了MSXML组件来访问Web Service 接口,后来因为跨平台的需要,在Linux平台下改用了GSOAP+TinyXML(TinyXPath)来完成所需功能。
使用TinyXPath还是遇到了一些问题,总结一下。
这里要说明一下TinyXPath是TinyXML+XPath,下载TinyXPath包的时候会包含TinyXML的原文件。
1. 使用XPath,来获取XML子节点TinyXpath所支持的XPath并不完整,而且缺少文档资料,试了一整天才试出来,直接把结果写下来1.)节点名大小写无关匹配这里要用到name函数和translate函数,首先转化所有的节点名到大写,然后再比较。
语法如下:*[translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='XXXX']name函数返回节点名字,translate函数转换到大写。
2.)节点内容比较text函数返回节点内容,语法为*[text()='XXXX']3.)选择固定位置节点position函数用以指定第几个节点,语法为:*[position()=XXX] ,此处是数字类型举个例子,我们要选定节点名字为AAA,内容为BBB的第二个节点,XPath应改名为:*[translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='AAA' and text()='BBB' and position()=2]这里还有个查询效率问题,并不确定把 position()=2 条件放在最前面是不是可以提高效率。
以上内容可以封装成一个函数:inline string getNodeXPath(const string & strNodeName, string strText="", string pos=""){string strVal;strVal += "*[";strVal += "translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') = '"+ strNode Name + "'";if(!strText.empty())strVal +=" and text()= '" +strText+"'";if(!pos.empty())strVal +=" and position()= " +pos;strVal += "]";return strVal;}#define NODE(node) getNode(node)#define NODE_AT(node,pos) getNode(node,"",pos)4.) 查询子节点满足一定条件的节点没有看到TinyXPath提供的直接可以获取子节点内容的函数,这里使用变通的方法,即先判断子节点条件然后使用parent关键词指定返回父节点,定义了HAS_CHILD宏#define HAS_CHILD(node,txt)string(string("/")+getNode(node,txt)+string("/parent::*"))举个例子:string strXPath;strXPath= "/" + NODE("XMLDATA") + "/" + NODE("RATES") ;strXPath+= "/" + NODE("REPORATEVO")+HAS_CHILD("TERMBYYEAR",mStrType)+HAS_CHILD("CONTRACTDATE",mStrSubTyp e);strXPath+= "/" + NODE("RATE");多个HAS_CHILD之间是并列关系。
web自动化学习04——xpath定位详解
web⾃动化学习04——xpath定位详解在元素定位过程中使⽤最多的是xpath定位,有以下⼏种定位⽅法:1)绝对定位:利⽤html属性,从/html/body/.../... ⼀直到需要定位的元素标签,其中如果存在多个相同的元素标签,如:有5个div标签,此时需要定位到的是第3个标签,则写为div[3] (ps:这种⽅式不推荐,因为前端只要有⼀丁点⼉变动,定位路径就不正确)2)相对定位:利⽤元素标签和元素标签的id,name,class等值进⾏定位,格式为://标签类型[@属性类型=‘属性值’],如百度搜索框则可以写为://input[@id='kw']3)利⽤层级与属性:当不能直接定位到元素时,可以定位到它的⽗级或者祖⽗级的元素在定位到指定位置,如百度搜索框:driver.find_element_by_xpath(" //span[@class='s_ipt_wr']/input")4)使⽤逻辑连接词:如果⼀个属性不能唯⼀确定⼀个元素时,可以使⽤逻辑连接词( and ,or)来连接多个属性。
如百度搜索框:driver.find_element_by_xpath(" //input[@class='s_ipt' and @name='wd']")5)contains()⽅式:若定位元素的属性中存在多个属性值,如下所⽰,可以使⽤contains(属性,'部分属性值')的⽅式定位,如://span[contains(class,'s_ipt_wr')]6)text()⽅式:对于类似链接的元素,可以使⽤text()⽅式根据⽂本信息定位元素,如:定位到百度⾸页的新闻标签,//a[text()='新闻']。
同时可以结合contains()来使⽤,如://a[contains(text(),'新闻')from selenium import webdriverclass elementLocator_Xpath():def__init__(self):# 加启动配置option = webdriver.ChromeOptions()# 关闭“chrome正受到⾃动测试软件的控制”# V75以及以下版本# option.add_argument('disable-infobars')# V76以及以上版本option.add_experimental_option('useAutomationExtension', False)option.add_experimental_option('excludeSwitches', ['enable-automation'])# 不⾃动关闭浏览器option.add_experimental_option("detach", True)self.driver= webdriver.Chrome(chrome_options=option)self.driver.get("")self.driver.maximize_window()#相对定位def xpath_relative(self):#定位搜索输⼊框search_input = self.driver.find_element_by_xpath("//input[@id='kw']")#输⼊郑州search_input.send_keys("郑州")#定位到搜索按钮search_button = self.driver.find_element_by_xpath("//input[@id='su']")#点击搜索按钮search_button.click()#绝对定位def xpath_absolute(self):# 定位搜索输⼊框search_input = self.driver.find_element_by_xpath("/html/body/div/div/div[5]/div/div/form/span/input")# 输⼊成都软件测试search_input.send_keys("成都软件测试")# 定位到搜索按钮search_button = self.driver.find_element_by_xpath("/html/body/div/div/div[5]/div/div/form/span[2]/input")# 点击搜索按钮search_button.click()#层级与属性结合def xpath_level_attribute(self):'''定位不到该元素时,可以先定位⽗亲级元素,再定位到该元素'''#先定位到搜索输⼊框的上上⼀级# 定位搜索输⼊框search_input = self.driver.find_element_by_xpath("//form[@id='form']/span/input") # 输⼊德昌天⽓search_input.send_keys("德昌天⽓")# 定位到搜索按钮search_button = self.driver.find_element_by_xpath("//form[@id='form']/span[2]/input") # 点击搜索按钮search_button.click()#逻辑运算符def xpath_logic_operator(self):#定位到搜索输⼊框search_input = self.driver.find_element_by_xpath("//input[@name='wd' and @class='s_ipt']") #输⼊美团search_input.send_keys("美团")#定位到搜索按钮search_button = self.driver.find_element_by_xpath("//input[@id = 'su' or @class = 's_btn']") #点击按钮search_button.click()#contains⽅法def xpath_contains(self):#定位到搜索框search_input = self.driver.find_element_by_xpath("//span[contains(@class,'s_ipt_wr ')]/input") #输⼊python⾃动化search_input.send_keys("python⾃动化")#定位到搜索按钮search_button = self.driver.find_element_by_xpath("//input[contains(@class,'s_btn')]") #点击搜索按钮search_button.click()#text()⽅法def xpath_text(self):#⽅法⼀:定位到新闻链接#news_href = self.driver.find_element_by_xpath("//a[text()='新闻']")#⽅法⼆:使⽤contains姐合text()定位news_href = self.driver.find_element_by_xpath("//a[contains(text(),'新闻')]")news_href.click()#点击新闻链接elementLocator_Xpath().xpath_text()。
js xpath的写法 -回复
js xpath的写法-回复如何使用JavaScript 和XPath 进行网页元素选择及操作当今,随着互联网的发展,我们越来越依赖于网络工具和信息。
网页作为我们访问信息的主要途径,往往包含大量的元素,如文本、图像、表单等。
在许多情况下,我们需要通过编程的方式对这些元素进行选择和操作,以实现我们的需求。
JavaScript 和XPath 是两种常用的用于网页元素选择及操作的工具,它们提供了丰富的功能和灵活的语法。
本文将一步一步地介绍如何使用JavaScript 和XPath 来选择和操作网页元素。
第一步,导入JavaScript 库要使用JavaScript 进行网页元素选择及操作,我们首先需要导入相应的JavaScript 库。
常用的JavaScript 库有jQuery、Prototype、Dojo 等。
在本文中,我们将以jQuery 为例来演示。
我们可以通过在HTML 文档的head 部分添加如下代码来导入jQuery:html<script src="以上代码将从jQuery 官方网站加载最新版本的jQuery 库。
导入成功后,我们就可以使用jQuery 提供的功能来选择和操作网页元素了。
第二步,使用XPath 选择器选择元素XPath 是一种通用的选择网页元素的语言,它使用路径表达式来定位网页元素。
在JavaScript 中,我们可以使用XPath 选择器来定位网页元素。
首先,我们需要了解XPath 的基本语法。
XPath 使用路径表达式来描述元素的路径。
路径表达式由斜杠(/)分隔的一系列元素节点组成。
例如,如果我们要选择id 为"myElement" 的元素,可以使用如下XPath 表达式:javascript"*[id='myElement']"以上选择器中的星号(*)表示任意元素节点,方括号中的id='myElement' 表示选择id 属性为"myElement" 的元素。
xpath用法 管道
xpath用法管道XPath(XML Path Language)是一种用于在XML 文档中定位和选择节点的语言。
XPath 使用路径表达式(path expressions)来描述节点的位置,其中的管道(`|`)用于组合多个路径表达式,使得可以选择多个节点集合。
以下是一些XPath 的基本用法,包括使用管道:基本路径表达式- `/`: 从根节点开始选择。
- `//`: 选择节点,不考虑其位置。
- `.`: 当前节点。
- `..`: 父节点。
使用管道选择多个节点集合XPath 中的管道符号`|` 可以用于组合多个路径表达式,返回一个包含这些表达式选择的所有节点的节点集合。
```xpath//element[@attribute='value'] | //anotherElement```上述示例选择所有具有指定属性值的`element` 节点以及所有`anotherElement` 节点。
示例考虑以下XML 文档:```xml<root><element attribute="value1">Node 1</element><element attribute="value2">Node 2</element><anotherElement>Another Node</anotherElement></root>```1. 选择所有具有指定属性值的节点以及所有`anotherElement` 节点:```xpath//element[@attribute='value1'] | //anotherElement```这将返回两个节点集合,一个包含具有`attribute='value1'` 的`element` 节点,另一个包含所有`anotherElement` 节点。
Selenium-xpath定位
Selenium-xpath定位序⾔:前⾯介绍了利⽤浏览器的debug⼯具获取xpath地址,但是这个⼯具不是万能的,有时候直接复制粘贴会定位不到。
这个时候就需要⾃⼰⼿动去写xpath路径了。
接下来将详细讲解xpath的常⽤语法。
⼀、xpath的基本概念和基本语法谓语(Predicates)谓语⽤来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在⽅括号中。
⼆、下⾯我们开始介绍xpath的⼀些常⽤定位⽅法语法:xpath = "//标签名[@属性='属性值']"1. 属性定位(1)通过id属性定位driver.find_element_by_xpath('//*[@id="kw"]')(2)通过name属性定位element = driver.find_element_by_xpath('//*[@name="wd"]')(3)通过class属性定位element = driver.find_element_by_xpath('//*[@class="s_ipt"]')(4)通过⽂本信息定位或autocomplete属性等定位。
element = driver.find_element_by_xpath('//*[@autocomplete="off"]')# 通过autocomplete属性定位element = driver.find_element_by_xpath('//*[text()="hao123"]')# 通过⽂本信息定位(5)属性判断条件中最常见为id,name,class等等,属性的类别没有特殊限制,只要能够唯⼀标识⼀个元素即可。
当然在属性不唯⼀的时候,如果采取多个条件组合的⽅式能达到唯⼀也可以。
lxml模块的xpath函数返回的数据类型
lxml模块的xpath函数返回的数据类型一、介绍lxml是Python的一个功能强大和高效的处理XML和HTML的库。
它是基于libxml2和libxslt库,并且具有简单易用的API。
lxml的xpath函数是其中一个非常重要的功能,它用于通过xpath表达式来选择XML或HTML文档中的元素。
在本文中,我们将探讨lxml模块的xpath函数返回的数据类型。
二、xpath函数返回的数据类型1. Element当xpath选择的节点是一个元素时,xpath函数返回的数据类型是Element。
Element代表XML或HTML文档中的元素,我们可以通过属性或方法来访问和操作这个元素。
2. ElementTree当xpath选择的节点是整个文档时,xpath函数返回的数据类型是ElementTree。
ElementTree代表整个XML或HTML文档,我们可以通过它来访问和操作文档中的元素。
3. ElementUnicodeResult当xpath选择的节点是文本节点时,xpath函数返回的数据类型是ElementUnicodeResult。
ElementUnicodeResult代表文本节点的内容,我们可以通过它来获取文本节点的值。
4. List[Element]当xpath选择的节点有多个匹配时,xpath函数返回的数据类型是一个Element构成的列表。
这意味着我们可以通过遍历这个列表来访问和操作每个匹配的元素。
5. None当xpath没有匹配到任何节点时,xpath函数返回的数据类型是None。
这表示选择的节点不存在,或者xpath表达式写错了。
三、个人观点和总结lxml模块的xpath函数返回的数据类型非常灵活,它可以根据选择的节点的不同情况返回不同的数据类型。
这使得我们可以更方便地处理XML和HTML文档中的元素和内容。
无论是操作单个元素,还是遍历多个匹配的元素,都可以很容易地实现。
xpath last()用法
XPath last()函数是XPath语言中的一个重要函数,它用于定位节点集合中的最后一个节点。
在实际应用中,经常会遇到需要定位最后一个节点的情况,例如在页面中定位最后一个列表项、最后一个表格行等。
本文将从以下几个方面介绍XPath last()函数的用法和实际应用。
1. XPath last()函数的基本语法XPath last()函数的基本语法如下所示:last()该函数不需要任何参数,直接调用即可。
它返回一个数字,表示当前节点集合中的最后一个节点的索引。
2. XPath last()函数的使用方法XPath last()函数通常与其他定位方法配合使用,用于定位当前节点集合中的最后一个节点。
我们可以使用last()函数和索引值配合使用,来定位最后一个节点。
具体示例如下://ul/li[last()]上面的示例代码中,我们首先定位 ul 元素下的所有 li 子元素,然后使用 [last()] 来定位最后一个 li 元素。
3. 实际应用示例接下来,我们将通过一个实际的案例来介绍XPath last()函数的应用。
假设我们需要从一个网页中提取出最后一篇文章的标题,那么可以借助XPath last()函数来实现。
具体的XPath表达式如下://div[@class='article']/h2[last()]上面的示例代码中,我们首先定位 class 为 article 的 div 元素,然后使用 last() 函数定位其中的最后一个 h2 元素,从而得到最后一篇文章的标题。
4. XPath last()函数的注意事项在使用XPath last()函数时,需要注意以下几点:- last() 函数返回的是一个索引值,索引从1开始而不是从0开始。
这与一般的编程习惯有所不同,需要特别注意。
- 在某些情况下,可能会存在多个节点满足条件,此时使用 last() 函数可能会得到意想不到的结果。
因此在实际应用中,需要结合具体情况进行判断和调试。
C#使用xpath找到一个节点
C#使⽤xpath找到⼀个节点Xpath这是⾮常强⼤。
但对⽐是⼀个更复杂的技术,希望上⾯去博客园特别想看看⼀些专业职位。
下⾯是⼀些简单Xpath的语法和⽰例,给你参考<?xml version="1.0" encoding="ISO-8859-1"?><catalog><cd country="USA"><title>Empire Burlesque</title><artist>Bob Dylan</artist><price>10.90</price></cd><cd country="UK"><title>Hide your heart</title><artist>Bonnie Tyler</artist><price>9.90</price></cd><cd country="USA"><title>Greatest Hits</title><artist>Dolly Parton</artist><price>9.90</price></cd></catalog>定位节点XML是树状结构,类似档案系统内数据夹的结构。
XPath也类似档案系统的路径命名⽅式。
只是XPath 是⼀种模式(Pattern)。
能够选出 XML 档案中,路径符合某个模式的全部节点出来。
⽐如要选catalog底下的cd中全部price元素能够⽤:/catalog/cd/price假设XPath的开头是⼀个斜线(/)代表这是绝对路径。
XPATH定位方法总结
XPATH定位⽅法总结XPath定位详解 ⼀般选择xpath定位是因为⽆论⽤id、name、class等,都不能唯⼀定位的时候。
1.2.1 绝对路径法 (1)就是从HTML⽂件最外⾯⼀层tag⼀直找到所要的元素的tag为⽌;(2)如果某⼀层有多个同名的tag,就⽤数组标注的⽅式;(3)以单斜杠、双斜杠开头都可以。
driver.find_element_by_xpath(‘/html/body/div/div[2]/form/div/div[2]/div/input[3]’).click()driver.find_element_by_xpath(‘//html/body/div/div[2]/form/div/div[2]/div/input[3]’).click()1.2.2 相对路径法 使⽤绝对路径太长。
可以选择离当前元素最近的⼀个层级,且那个层级可以使⽤⾮path法唯⼀定位。
⽐如,离当前元素最近的⼀层元素有id: driver.find_element_by_xpath(‘//html/body/div[2]/table/tbody/tr/td[1]/div[1]/div[5]/div/div/table/tbody/tr[3]/td[2]/a’).click() driver.find_element_by_xpath(“//div[@id=’gallery_sl’]/div/table/tbody/tr[3]/td[2]/a”).click() 相对路径的第⼀个元素定位⽅法:(1)最外⼀层双引号;(2)第⼀个元素的:tag名称[@元素属性=’元素值’];(3)不论是元素的id,名称还是什么属性,都⽤@引⽤。
1.2.3 类似partical_link_text法 注意最前⾯⽤双斜杠,不仅可以⽤于链接式的⽂本,也能⽤于其他含⽂本的元素。
driver.find_element_by_css_selector("//a[contains(text(),'平⾯设计')]").click()1.2.4 XPATH多次最短路径定位driver.find_element_by_xpath(“//tr[@id=’login_btn’]//td[text()=’登录’]”).click()driver.find_element_by_xpath(“/*/tr[@id=’login_btn’]//td[text()=’登录’]”).click()中间⽤双斜线或者双斜线中间加⼀个星号来表⽰中间有若⼲个tag1.2.5 ⽤元素的text属性定位的两种表达式driver.find_element_by_xpath(“/*/tr[@id=’login_btn’]//td[text()=’登录’]”).click()两者的区别:第⼀种元素的属性必须为“登录”只能相等,⽽第⼆种包含字符就⾏,如“登录按钮”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<!--electric.xsl -->
<xsl:stylesheet version="1.0"
xmlns:xsl="/1999/XSL/Transform">
<xsl:template match="/">
<electric type="联想家电系列" count="3" info="1995age购买,现在(2008/3/31)正常使用" />
</family>
</electric_info>
在XSL文件中通过使用XPath来定位number元素,并通过循环依次输出number元素的name属性。处理该XML文档的electric.xml文件内容如下所示:
XPath
XPath用来查询指定的节点数据,在本实例使用XPath来简单查询指定节点列表。XML文件内容如下所示:
<?xml version="1.0" encoding="GB2312" ?>
<?xml-stylesheet type="text/xsl" href="electric.xsl"?>
<!--electric.xml -->
<electric_info>ber name="郭禄" sex="男" age="25" />
<member name="符荣" sex="女" age="25" love="乒乓球"/>
<electric type="黑白电视机" count="3" info="1982age购买,现在(2008/3/31)正常使用" />
</xsl:stylesheet>
在根模板中,在最外层中的xsl:for-each的select属性值“electric_info/family”来指定选择所有family元素下所有节点集合,通过里层的for-each的select属性值“member”来选择所有electric_info/family/下面的member元素,最后通过value-of的select属性值“@name”来显示member元素的name属性,运行效果如图9-2所示。
</family>
<family>
<member name="赵俊" sex="男" age="30" />
<member name="岳楠" sex="女" age="31" love="游泳,跑步"/>
<electric type="家庭影院" count="3" info="1980age购买,现在(2008/3/31)正常使用" />
图9-2显示指定列表元素
<xsl:for-each select="electric_info/family">
<xsl:for-each select="member">
<xsl:value-of select="@name" />
</xsl:for-each><br/>
</xsl:for-each>
</xsl:template>