Python的Xpath

在python爬虫采集领域,会需要学习到正则表达式和Xpath表达式。这一篇笔记简单介绍一下Xpath相关的内容。

Xpath的概念

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

XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择。

Xpath的解析原理是:

1.实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。

2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。

怎样才能在Python使用Xpath

lxml支持Xpath解析方式,这里是用的lxml.安装库lxml的方法可以见之前的笔记:龟速学爬虫笔记④龟速学爬虫笔记④

安装好之后需要实例化一个etree对象,可以把你需要的源码数据加载到这里面

etree. parse(filepath)#文件路径

例如:

etree.parse('D:\\111.txt')#实例化一个etree对象

Xpath表达式

选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式

描述

nodename

选取此节点的所有子节点。

/

从根节点选取。

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

.

选取当前节点。

..

选取当前节点的父节点。

@

选取属性。

在下面的表格中列出了一些路径表达式以及表达式的结果:

路径表达式

结果

bookstore

选取 bookstore 元素的所有子节点。

/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book

选取属于 bookstore 的子元素的所有 book 元素。

//book

选取所有 book 子元素,而不管它们在文档中的位置。

bookstore//book

选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。

//@lang

选取名为 lang 的所有属性。

一个示例

假设有一个这样的HTML文档



    
    test


    

喵喵

天使猫猫

巧克力猫

草莓猫猫

彩虹猫猫

我太可爱了,怎么办呢 咖啡魔力猫
Python的Xpath_第1张图片

假设需要寻找的是:

喵喵

天使猫猫

巧克力猫

草莓猫猫

彩虹猫猫

我太可爱了,怎么办呢

咖啡魔力猫

以及

以上三个该html文档所包含的全部div节点,

那么就有以下三种方法可以实现:

  1. 从上往下顺序查找

  1. 跳跃了一个节点来找到这个div节点的对象

  1. 跳跃上面所有节点寻找

#Xpath
etree.parse('D:\\111.html')#实例化一个etree对象
#查找一个节点
tree=etree.parse('D:\\111.html')
r1=tree.xpath('/html/body/div')
r2=tree.xpath('/html//div')
r3=tree.xpath('//div')
print(r1,r2,r3)

结果如下:

[, , ] [, , ] [, , ]

当想要获取标签时,就要进行属性定位。

例如想要获取的是div中cute的标签

,那么类似地,可以这样进行:

r4=tree.xpath('//div[@class="cute"]')
print(r4)

返回某一类下的单独的标签,例如天使猫猫,则需要进行索引定位,可以这样:

r4=tree.xpath('//div[@class="cute"]/p[1]')
print(r4)

想要返回整个/p的列表的话,只需要:

r4=tree.xpath('//div[@class="cute"]/p')
print(r4)

需要注意的是,这里的顺序是从1开始,而不是从0开始。

以上返回的结果均是element,如果需要获取文本,就需要进行element到text()的转换:

r5=tree.xpath('//div[@class="ero"]/li[5]/b/text()')
print(r5)
['cute']#返回结果

这样可以直接返回字符串:

r5=tree.xpath('//div[@class="ero"]/li[5]/b/text()')[0]
print(r5)

直接返回标签li下所有文本,则只需要定位到//li并转换成text()即可。

获取属性的话直接用@属性名就好啦

你可能感兴趣的:(编程,网络安全,python,爬虫,开发语言,网络安全)