生活指南——让生活变得更简单

xpath定位语法_xpath定位方法python

课程:

Python怎样获取XPath下的A标签的内容

1、在浏览器中打开网页。然后//div,就可以找到页面中的所有div了,因为//表示的是任意目录下查找。如图,页面有两个div,所以可以找到两个。

2、要查找类为a的div,可以在div后面用[@class="9e59-f311-2149-7f16 类名"]来指定,这样没有类名a的div就会被过滤掉,当然,还可以用id,把class改为[@id="id名"]即可。

3、用//,这样div下面的非a标签就会被跳过,直接去找a标签。

4、如果要获取a标签的href,那么可以获取到a标签后用/@href即可获得。

5、如果是获取文本的话,可以用text()这个方法,就会得到a标签里面的内容。

6、斜杠/表示的是获取子元素,比如div下面有两个子元素p,那么//div[2]/p获取的就是第二个div的子元素p。

appium python xpath 定位问题,新手问题。

按照你的想法,在ListView前面的那个LinearLayout

应该为LinearLayout[1]\ListView[0],至于原因,想想数组的调用

xpath的获取,如果是网页端的很方便

用chrome, 选中你要获取的元素右键鼠标,审查元素。然后在开发者窗口中,定位到的代码处,右键鼠标,有个copy xpath,点击即可

公司限制,莫法给你图片演示了

python xpath怎么用

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

在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基本概念。首先要说的是XPath数据类型。XPath可分为四种数据类型:

节点集(node-set)

节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。

布尔值(boolean)

由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和false两个值。布尔值可以和数值类型、字符串类型相互转换。

字符串(string)

字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。

数值(number)

在XPath中数值为浮点数,可以是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大 infinity、负无穷大-infinity、正负0等等。number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。

其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。由于XML文档的逻辑结构,一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还可以包含属性,并可以利用属性来定义命名空间。相应地,在XPath中,将节点划分为七种节点类型:

根节点(Root Node)

根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。

元素节点(Element Nodes)

元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。

元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。

文本节点(Text Nodes)

文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。

属性节点(Attribute Nodes)

每一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。

对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为#IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。

此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。

命名空间节点(Namespace Nodes)

每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。

处理指令节点(Processing Instruction Nodes)

处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。

注释节点(Comment Nodes)

注释节点对应于文档中的注释。下面,我们来构造一棵XML文档树:

A id=”a1″

B id=”b1″

C id=”c1″

B name=”b”/

D id=”d1″/

E id=”e1″/

E id=”e2″/

/C

/B

B id=”b2″/

C id=”c2″

B/

D id=”d2″/

F/

/C

E/

/A

现在,来实现一些利用Xpath使XML中节点匹配的基本方法。

路径匹配

路径匹配与文件路径的表示相仿,比较好理解。有以下几个符号:

符 号

含 义

举 例

匹配结果

/

指示节点路径

/A/C/D

节点”A”的子节点”C”的子节点”D”,即id值为d2的D节点

/

根节点

//

所有路径以”//”后指定的子路径结尾的元素

//E

所有E元素,结果是所有三个E元素

//C/E

所有父节点为C的E元素,结果是id值为e1和e2的两个E元素

*

路径的通配符

/A/B/C/*

A元素→B元素→C元素下的所有子元素,即name值为b的B元素、id值为d1的D元素和id值为e1和e2的两个E元素

/*/*/D

上面有两级节点的D元素,匹配结果是id值为d2的D元素

//*

所有的元素

|

逻辑或

//B | //C

所有B元素和C元素

位置匹配

对于每一个元素,它的各个子元素是有序的。如:

举 例

含 义

匹配结果

/A/B/C[1]

A元素→B元素→C元素的第一个子元素

name值为b的B元素

/A/B/C[last()]

A元素→B元素→C元素的最后一个子元素

id值为e2的E元素

/A/B/C[position()1]

A元素→B元素→C元素之下的位置号大于1的元素

id值为d1的D元素和两个具有id值的E元素

属性及属性值

在XPath中可以利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有”@”前缀。例如:

举 例

含 义

匹配结果

//B[@id]

所有具有属性id的B元素

id值为b1和b2的两个B元素

//B[@*]

所有具有属性的B元素

两个具有id属性的B元素和一个具有name属性B元素

//B[not(@*)]

所有不具有属性的B元素

A元素→C元素下的B元素

//B[@id="b1"]

id值为b1的B元素

A元素下的B元素

亲属关系匹配

XML文档可归结为树型结构,因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,同样可以用到这些概念。例如:

举 例

含 义

匹配结果

//E/parent::*

所有E节点的父节点元素

id值为a1的A元素和id值为c1的C元素

//F/ancestor::*

所有F元素的祖先节点元素

id值为a1的A元素和id值为c2的C元素

/A/child::*

A的子元素

id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素

/A/descendant::*

A的所有后代元素

除A元素以外的所有其它元素

//F/self::*

所有F的自身元素

F元素本身

//F/ancestor-or-self::*

所有F元素及它的祖先节点元素

F元素、F元素的父节点C元素和A元素

/A/C/descendant-or-self::*

所有A元素→C元素及它们的后代元素

id值为c2的C元素、该元素的子元素B、D、F元素

/A/C/following-sibling::*

A元素→C元素的紧邻的后序所有兄弟节点元素

没有任何属性的E元素

/A/C/preceding-sibling::*

A元素→C元素的紧邻的前面所有兄弟节点元素

id值为b1和b2的两个B元素

/A/B/C/following::*

A元素→B元素→C元素的后序的所有元素

id为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、无属性的E元素。

/A/C/preceding::*

A元素→C元素的前面的所有元素

id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为b的B元素、id为c1的C元素、id为b1的B元素

条件匹配

条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。常用于条件匹配的函数有四大类:节点函数、字符串函数、数值函数、布尔函数。例如前面提到的last()、position()等等。这些功能函数可以帮助我们精确寻找需要的节点。

函数功能及作用 :

count()功能 : 统计计数,返回符合条件的节点的个数

number()功能 : 将属性的值中的文本转换为数值

substring() 功能

语法:substring(value, start, length)

截取字符串

sum()功能 : 求和

这些功能只是XPath语法中的一部分,还有大量的功能函数没有介绍,而且目前XPath的语法仍然在不断发展中。通过这些函数我们可以实现更加复杂的查询和操作。

以上这些匹配方法中,用得最多的还要数路径匹配。依靠给出相对于当前路径的子路径来定位节点的。

了解xpath了,现在就可以分析html了,代码举例:

view source

print?

1

import

lxml.html

2

html

=

'''

数量: 1

''' doc = lxml.html.fromstring(html) numList = doc.xpath('//td[@style="padding-bottom: 5px;" and @nowrap="" and not(@align="right")]/text()')

xpath的语法中'/'和'//'的区别

/是在它的子结点中查找,而//是在它的所有子结点中查找,包括子结点的子结点等等

比如:

root

lev1

lev2lev2_1/lev2

/lev1

lev2

lev2_2

/lev2

/root

那么如果用lev1/lev2只能得到文本是lev2_2的这个结点,而如果用lev1//lev2,则两个lev2结点都能得到

如何在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节点。

selenium python 通过Xpath定位取出页面元素

span后面加上text()即driver.find_element_by_xpath("//div[@id='content']/div/div/div/div/div/div/div[2]/div[2]/div[%d]/span/text()"%i).click()

python爬虫如何定位

4种方法可以定位爬虫位置:

1、传统 BeautifulSoup 操作

经典的 BeautifulSoup 方法借助 from bs4 import BeautifulSoup,然后通过 soup = BeautifulSoup(html, "lxml") 将文本转换为特定规范的结构,利用 find 系列方法进行解析。

2、基于 BeautifulSoup 的 CSS 选择器

这种方法实际上就是 PyQuery 中 CSS 选择器在其他模块的迁移使用,用法是类似的。关于 CSS 选择器详细语法可以参考: 由于是基于 BeautifulSoup 所以导入的模块以及文本结构转换都是一致的。

3、XPath

XPath 即为 XML 路径语言,它是一种用来确定 XML 文档中某部分位置的计算机语言,如果使用 Chrome 浏览器建议安装 XPath Helper 插件,会大大提高写 XPath 的效率。

4、正则表达式

如果对 HTML 语言不熟悉,那么之前的几种解析方法都会比较吃力。这里也提供一种万能解析大法:正则表达式,只需要关注文本本身有什么特殊构造文法,即可用特定规则获取相应内容。依赖的模块是re

希望以上回答可以帮助到你。

  • 评论列表:
  •  访客
     发布于 2022-07-08 05:55:31  回复该评论
  • ()、position()等等。这些功能函数可以帮助我们精确寻找需要的节点。函数功能及作用 :count()功能 : 统计计数,返回符合条件的节点的个数number()功能 : 将属性的值中的文本转换为数
  •  访客
     发布于 2022-07-08 02:47:33  回复该评论
  • menu']/h3[text()='text']/following-sibling::ul[1]")更简单的方法就是像jQuery那样直接根据id定位:nodes=tree.xpath(u"//div[@id='leftmenu']/h3[text()='text']/f
  •  访客
     发布于 2022-07-08 01:39:55  回复该评论
  • from lxml import etree3 f=codecs.open("ceshi.html","r","utf-8")4 content=f.read()5 f.close()6 tree=et

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright Your WebSite.Some Rights Reserved.