做一个租房卖房的网站怎么做/网络营销外包收费
xpath匹配子节点
我们通过/或//即可查找元素的子节点或子孙节点。假如现在想选择li节点的所有直接子节点,可以这样实现:
这里通过追加/a即选择了所有li节点的所有直接子节点。因为//li用于选中所有li节点,/a用于选中li节点的所有直接子节点a。二者组合在一起即获取所有li节点的所有直接a子节点。
运行结果如下:
此处的/用于选取直接子节点,如果要获取所有子孙节点,就可以使用//。例如,要获取ul节点下的所有子孙a节点,可以这样实现:
运行结果是一样的:
但是如果这里用//ul/a,就无法获取任何结果了。因为/用于直接获取子节点,而在ul节点下没有直接的a节点,只有li节点,所以无法获取任何匹配的结果,代码如下:
运行结果如下:
因此,这里我们需要注意的是/和//的区别,其中/用于获取直接子节点,//用于获取子孙节点。
xpath匹配父节点
我们知道通过连续的/或//可以查找子节点或子孙节点,那么假如我们知道了子节点,怎样来查找父节点呢?这里可以两个.符号来实现。
比如,现在首先选中href属性为link4.html的a节点,然后再获取其父节点,然后再获取其class属性,相关代码如下:
运行结果如下:
检查一下结果发现,这正是我们获取的目标li节点的class。
同时,我们也可以通过parent::来获取父节点,代码如下:
得到的结果也是一样的:
xpath属性匹配
在选取的时候,我们还可以用@符号进行属性过滤。比如,这里如果要选取class为item-0的li节点,可以这样实现:
这里我们通过假如[@class="item-0"],限制了节点的class属性为item-0,而HTML文本中符合条件的li节点有两个,所以结果应该返回两个匹配到的元素。结果如下:
xpath文本获取
我们利用Xpath中的text( )方法获取节点中的文本,接下来尝试获取前面li节点中的文本,相关代码如下:
运行结果如下:
奇怪的是我们没有获取到任何文本,只获取到了一个换行符,这是为什么呢?因为Xpath中text( )前面是/,而此处/的含义是选取直接子节点,很明显li的直接子节点都是a节点,文本都是在a节点内部的,所以这里匹配到的结果就是被修正的li节点内部的换行符,因为自动修正的li节点的尾标签换行了。
即选中的是这两个节点:
其中一个节点因为自动修正,li节点的尾标签添加的时候换行了,所以提取文本得到的唯一结果就是li节点的尾标签和a节点的尾标签之间的换行符。
因此,如果想获取li节点内部的文本,就有两种方式,一种是先选取a节点再获取文本,另一种就是使用//。接下来,我们来看一下二者的区别。
首先,选取到a节点再获取文本,代码如下:
可以看到,这里的返回值是两个,内容都是属性为item-0的li节点的文本,这也印证了前面属性匹配的结果是正确的。
这里我们是逐层选取的,先选取了li节点,又利用/选取了其直接子节点a。然后再选取其文本得到的结果,刚好是符合我们预期的两个结果。
再来看下用另外一种方式(即使用//)选取的结果,代码如下:
运行结果如下:
这里返回的结果是3个,可以知道,这里是选取所有子孙节点的文本,其中前两个就是li的子节点a节点内部的文本,另外一个就是最后一个li节点内部的文本,即换行符。
所以说,如果要想获取子孙节点内部的所有文本,可以直接使用//加text( )的方式,这样可以保证获取到最全面的文本信息,但是可能会夹杂一些换行符等特殊字符。如果想获取某些特定子孙节点下的所有文本,可以先选取到特定的子孙节点,然后再调用text( )方法获取其内部文本,这样可以保证获取的结果是整洁的。