当前位置:首页 > 资讯 > 正文

(十八)Python爬虫:XPath的使用

(十八)Python爬虫:XPath的使用

      经历了爬取豆瓣电影TOP250数据我们会发现使用正则表达式其实并没有多么方便,有没有更加好的工具呢?答案当然是有的。接下来将使用三个篇幅分别介绍XPath,Beautiful Soup和pyquery这三个解析库。


      XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。 起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。[来自360百科] 现在我们使用它对HTML文档进行搜索。

      lxml库是Python的一个解析库,支持HTML和XML的解析,支持XPath。下面介绍在Windows,Linux和Mac上的安装。

Windows下的安装

      首先使用命令`pip3 install lxml`进行安装。如果没有错误信息说明安装成功了;如果出现错误,比如缺少libxml2库,使用wheel文件离线安装。提供Win64位,Python3.6的lxml安装包:https://pan.baidu.com/s/1wM1xKxCxOH8QOWclp6iasw。使用命令`pip3 install lxml-4.2.4-cp36-cp36m-win_amd64.whl`进行安装。

Linux下的安装

      首先也是使用命令`pip3 install lxml`进行安装。如果没有错误信息说明安装成功了。如果报错一般都是缺少必要的库,可以参考以下解决方案。
  • Centos、Red Hat:
 
  • Ubuntu、Debian和Deepin:
 

安装好这些必要的类库后重试命令进行安装。

Mac下的安装

      首先也是使用命令`pip3 install lxml`进行安装。如果没有错误信息说明安装成功了。如果报错一般都是缺少必要的库,执行命令`xcode-select --install`。再次重试安装命令。

验证安装

表达式描述nodename选择这个节点名的所有子节点/从当前节点选择直接子节点//从当前节点选取子孙节点.选择当前节点…选取当前节点的父节点@选取属性

以下是一段HTML:

 

显然,这段HTML中的节点没有闭合,我们可以使用lxml中的etree模块进行补全。

 
 

除了直接读取文本进行解析,etree也可以读取文件进行解析。

 
 
 

      根据XPath常用规则可以知道通过//可以查找当前节点下的子孙节点,以上面的html为例获取所有节点。

 
 

      如果我们不要获取所有节点而是指定获取某个名称的节点,只需要将*改为指定节点名称即可。如获取所有的li节点

 
 
 

      根据XPath常用规则我们可以使用/或//获取子孙节点或子节点。现在我要获取li节点下的a节点。

 
 
 

      根据XPath常用规则可以通过匹配指定的属性。我们通过class属性找最后一个li节点。

 
 

      根据XPath常用规则可以通过获取当前节点的父节点。现在我要获取最后一个节点的父节点下的class属性。

 
 

      很多时候我们找到指定的节点都是要获取节点内的文本信息。我们使用方法获取节点中的文本。现在获取所有a标签的文本信息。

 
 
 

      在上面的例子中所有的属性值都只有一个,如果属性值有多个还能匹配的上吗?

 
 
 
 
 

      属性多值匹配是节点属性有许多个值,我们根据一个值获取符合添加的节点。由于我们很多情况下无法仅仅根据一个属性值就获取到目标节点,往往要根据多个属性来获取目标节点。

 

也许你会说这个直接使用name的属性值就可以得到了,然而,这里只是作为演示。

下面列出了可用在 XPath 表达式中的运算符:

【上表来源:w3school运算符】

      在上面的操作中我多次找第2个li节点或找最后一个li节点,使用属性值进行匹配。其实何必呢!我们可以根据顺序进行选择。

 
 

我们使用了last()和postion()函数,在XPath中还有很多函数,详情见:w3school 函数。

      我们可以通过XPath获取祖先节点,属性值,兄弟节点等等,这就是XPath的节点轴。轴可定义相对于当前节点的节点集。

【上表来源:[w3school XPath轴](https://www.w3cschool.cn/xpath/xpath-axes.html)】

使用示例: