右侧
国内最专业的黑客技术博客
当前位置:网站首页 > 黑客教程 > 正文

xpath绝对定位和相对定位的区别_xpath定位分析

作者:hacker发布时间:2022-07-14分类:黑客教程浏览:202评论:5


导读:目录:1、如何在python中使用xpath2、如何用xpath定位符合多个属性条件的节点集3、xpath定位定位到元素怎么不变黄色4、软件测试中实现web自...

目录:

如何在python中使用xpath

在进行网页抓取的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxml.html的xpath对html进行分析,获取抓取信息。

首先,我们需要安装一个支持xpath的python库。目前在libxml2的网站上被推荐的python binding是lxml,也有beautifulsoup,不嫌麻烦的话还可以自己用正则表达式去构建,本文以lxml为例讲解。

假设有如下的HTML文档:

1 html

2 body

3 form

4 div id='leftmenu'

5 h3text/h3

6 ul id=’china’!-- first location --

7 li.../li

8 li.../li

9 ......

10 /ul

11 ul id=’england’!-- second location--

12 li.../li

13 li.../li

14 ......

15 /ul

16 /div

17 /form

18 /body

19 /html

直接使用lxml处理:

1 import codecs

2 from lxml import etree

3 f=codecs.open("ceshi.html","r","utf-8")

4 content=f.read()

5 f.close()

6 tree=etree.HTML(content)

etree提供了HTML这个解析函数,现在我们可以直接对HTML使用xpath了,是不是有点小激动,现在就尝试下吧。

在使用xpath之前我们先来看看作为对照的jQuery和RE。

在jQuery里要处理这种东西就很简单,特别是假如那个ul节点有id的话(比如是ul id=’china’):

$("#china").each(function(){...});

具体到此处是:

$("#leftmenu").children("h3:contains('text')").next("ul").each(function(){...});

找到id为leftmenu的节点,在其下找到一个内容包含为”text”的h3节点,再取其接下来的一个ul节点。

在python里要是用RE来处理就略麻烦一些:

block_pattern=re.compile(u"h3档案/h3(.*?)h3", re.I | re.S)

m=block_pattern.findall(content)

item_pattern=re.compile(u"li(.*?)/li", re.I | re.S)

items=item_pattern.findall(m[0])

for i in items:

print i

那么用xpath要怎么做呢?其实跟jQuery是差不多的:

nodes=tree.xpath("/descendant::ul[@id='china']")

当然,现在没有id的话也就只能用类似于jQuery的方法了。完整的xpath应该是这样写的(注意,原文件中的TAG有大小写的情况,但是在XPATH里只能用小写):

nodes=tree.xpath(u"/html/body/form/div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")

更简单的方法就是像jQuery那样直接根据id定位:

nodes=tree.xpath(u"//div[@id='leftmenu']/h3[text()='text']/following-sibling::ul[1]")

这两种方法返回的结果中,nodes[0]就是那个“text”的h3节点后面紧跟的第一个ul节点,这样就可以列出后面所有的ul节点内容了。

如果ul节点下面还有其他的节点,我们要找到更深节点的内容,如下的循环就是把这些节点的文本内容列出:

nodes=nodes[0].xpath("li/a")

for n in nodes:

print n.text

对比三种方法应该可以看出xpath和jQuery对于页面的解析都是基于XML的语义进行,而RE则纯粹是基于plain text。RE对付简单的页面是没有问题,如果页面结构复杂度较高的时候(比如一堆的DIV来回嵌套之类),设计一个恰当的RE pattern可能会远比写一个xpath要复杂。特别是目前主流的基于CSS的页面设计方式,其中大部分关键节点都会有id――对于使用jQuery的页面来说则更是如此,这时xpath相比RE就有了决定性的优势。

附录:基本XPATH语法介绍,详细请参考XPath的官方文档

XPATH基本上是用一种类似目录树的方法来描述在XML文档中的路径。比如用“/”来作为上下层级间的分隔。第一个“/”表示文档的根节点(注意,不是指文档最外层的tag节点,而是指文档本身)。比如对于一个HTML文件来说,最外层的节点应该是”/html”。

同样的,“..”和“.”分别被用来表示父节点和本节点。

XPATH返回的不一定就是唯一的节点,而是符合条件的所有节点。比如在HTML文档里使用“/html/head/scrpt”就会把head里的所有script节点都取出来。

为了缩小定位范围,往往还需要增加过滤条件。过滤的方法就是用“[”“]”把过滤条件加上。比如在HTML文档里使用“/html/body/div[@id='main']”,即可取出body里id为main的div节点。

其中@id表示属性id,类似的还可以使用如@name, @value, @href, @src, @class….

而 函数text()的意思则是取得节点包含的文本。比如:divhellopworld/p /div中,用”div[text()='hello']“即可取得这个div,而world则是p的text()。

函数position()的意思是取得节点的位置。比如“li[position()=2]”表示取得第二个li节点,它也可以被省略为“li[2]”。

不过要注意的是数字定位和过滤 条件的顺序。比如“ul/li[5][@name='hello']”表示取ul下第五项li,并且其name必须是hello,否则返回空。而如果用 “ul/li[@name='hello'][5]”的意思就不同,它表示寻找ul下第五个name为”hello“的li节点。

此外,“*”可以代替所有的节点名,比如用”/html/body/*/span”可以取出body下第二级的所有span,而不管它上一级是div还是p或是其它什么东东。

而 “descendant::”前缀可以指代任意多层的中间节点,它也可以被省略成一个“/”。比如在整个HTML文档中查找id为“leftmenu”的 div,可以用“/descendant::div[@id='leftmenu']”,也可以简单地使用“ //div[@id='leftmenu']”。

至于“following-sibling::”前缀就如其名所说,表示同一层的下一个节点。”following-sibling::*”就是任意下一个节点,而“following-sibling::ul”就是下一个ul节点。

如何用xpath定位符合多个属性条件的节点集

查找所有book节点(xpath: //book),对每个节点分析其属性,MSXML都有相关的函数.

MSXMLNS::IXMLDOMNodeListPtr pNodeList = NULL;

MSXMLNS::IXMLDOMNamedNodeMapPtr methodpAttrs = NULL;

MSXMLNS::IXMLDOMNodePtr pmethodAttrItem;

MSXMLNS::IXMLDOMNodePtr psNode;

MSXMLNS::IXMLDOMNodePtr requiredNode;

pNodeList = m_pDomDoc-selectNodes((_bstr_t)"//book");

int num = pNodeList-Getlength();

long nCount = 0;

for(int i=0;inum;i++)

{

psNode=pNodeList-Getitem(i);//取得psNode的节点值

psNode-get_attributes(methodpAttrs);

methodpAttrs-get_length(nCount);

for(int nmethod = 0; nmethod nCount; nmethod++) //属性值的循环

{

methodpAttrs-get_item(nmethod,pmethodAttrItem);

CString strgetName = FromBSTR((_bstr_t)pmethodAttrItem-nodeName);

CString strgetValue = FromBSTR((_bstr_t)pmethodAttrItem-nodeTypedValue);//得到属性值后进行相应的操作

}

}

xpath定位定位到元素 怎么不变黄色

xpath定位方法详解:

1.xpath较复杂的定位方法:

//from[@id='login_from']dl/dt/input[@id='j_password']

或者写成 input[@id='j_password']'));

2.xpath的模糊定位方法:

a、用contains关键字定位:

driver.findElement(By.xpath('//a[contains(@href,'logout')]'));

b. 用start-with,定位代码如下:

driver.findElement(By.xpath(“//a[starts-with(@rel, ‘nofo’)]));

c. 用Text关键字,定位代码如下:

driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));

d.如果知道超链接元素的文本内容,也可以用

driver.findElement(By.xpath(“//a[contains(text(), ’退出’)]));

3.XPath 关于网页中的动态属性的定位,例如,ASP.NET 应用程序中动态生成 id 属性值,可以有以下四种方法:

//input[contains(@id,'crtl')]

//input[starts-with(@id,'crtl')]

//input[ends-with(@id,'crtl')]

//input[contains(text(),'退出')]

软件测试中实现web自动化如何使用xpath定位元素

xpath 的语法 element = driver.find_element_by_xpath(xpath)

1 路径以“/”开始 表示找到满足该绝对路径的元素;

2 路径以//element”开始 表示找到文档中所有满足“//”后规则的元素 如//element 表示找到所有element元素,我们推荐使用相对定位

3 路径以//* 表示所有 如//* 表示选择所有元素;

4 可以用个属性来定位 //element[@ 属性="值"] 来进行定位

5 通过层级来进行定位 //element[@属性='值'] / 子元素

如果想了解更多,可以到传智播客官网看看。

xpath怎样根据一个元素定位另外一个元素

只要加入这句语句就可以了//span[text()='唯一标识']/../preceding-sibling::td/input[@type='checkbox']

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。

标签:xpath定位分析


已有5位网友发表了看法:

  • 访客

    访客  评论于 2022-07-14 19:01:26  回复

    的时候,分析定位html节点是获取抓取信息的关键,目前我用的是lxml模块(用来分析XML文档结构的,当然也能分析html结构), 利用其lxml.html的xpath对html进行分析,获取抓取信息。首先,我们需要安装一个支持xpath的python库。目前在libxml2的网站上

  • 访客

    访客  评论于 2022-07-14 19:34:57  回复

    性='值'] / 子元素 如果想了解更多,可以到传智播客官网看看。xpath怎样根据一个元素定位另外一个元素只要加入这句语句就可以了//span[text()='唯一标识']/../preceding-sibling::t

  • 访客

    访客  评论于 2022-07-14 21:38:55  回复

    间节点,它也可以被省略成一个“/”。比如在整个HTML文档中查找id为“leftmenu”的 div,可以用“/descendant::div[@id='leftmenu']”,也可以简单地

  • 访客

    访客  评论于 2022-07-15 01:28:00  回复

    ='hello']”表示取ul下第五项li,并且其name必须是hello,否则返回空。而如果用 “ul/li[@name='hello'][5]”的意思就不同,它表示寻找ul下第五个na

  • 访客

    访客  评论于 2022-07-14 22:26:23  回复

    h(“//a[starts-with(@rel, ‘nofo’)]));c. 用Text关键字,定位代码如下:driver.findElement(By.xpat

欢迎 发表评论:

黑客教程排行
最近发表
标签列表