Python爬虫解析库的使用

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()方法获取其内部文本,这样可以保证获取的结果是整洁的。


转载请注明:http://www.aierlanlan.com/rzfs/7900.html