Python爬虫----Xpath语法快速入门

2020-12-17 16:33:28 浏览数 (5268)

什么是 Xpath?

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

       简单的来说:Xpath(XML Path Language)是一门在 XML 和 HTML 文档中查找信息的语言,可用来在 XML 和 HTML 文档中对元素和属性进行遍历。

XPath 开发工具

       这里给大家介绍两个小编用得较多也是用得最为广泛与便捷的工具:

  • Chrome 插件 XPath Helper (需科学上网);
  • Firefox 插件 Try XPath。

       当然 Chrome 插件 XPath Helper 也可以寻找安装包后通过插件伴侣安装,安装方法步骤如下:

  1.  打开插件伴侣,选择下载好的插件;
  2. 选择提取插件内容到桌面,桌面上会多一个文件夹;
  3. 把文件夹放入想要放的路径下;
  4. 打开谷歌浏览器,选择扩展程序,开发者模式打开,选择加载已解压的扩展程序,选择路径打开即可。

XPath 节点

       在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

XPath 语法

       XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

       使用方式:

       使用 // 获取整个页面当中的元素,然后写标签名,然后在写谓语进行提取,比如:

//title[@lang='en']

       需要注意的知识点:

  •  / 和 // 的区别:/ 代表只获取子节点,// 获取子孙节点,一般 // 用的比较多,当然也要视情况而定;
  • contains:有时候某个属性中包含了多个值,那么可以使用 contains 函数,示例如下:

//title[contains(@lang,'en')]

  • 谓词中下标是从 1 开始的,不是从 0 开始的

lxml 库

       lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。

       该库为第三方库需使用 pip 进行安装,命令如下:

pip install lxml

 基本使用:

       如下是案例实操的 html 文件代码,屏幕前的小伙伴可以保存下来一起动手练习。

<div>

    <ul>

         <li class="im-0"><a href="link1.html"> first </a></li>

         <li class="im-1"><a href="link2.html"> second </a></li>

         <li class="im-active"><a href="link3.html"> third </a></li>

         <li class="im-1"><a href="link4.html"> fourth </a></li>

         <li class="im-0"><a href="link5.html"> fifth </a>

     </ul>

 </div>

案例 1:将字符串解析为 html 文档

from lxml import etree

text = ''

html = etree.HTML(text) #读取

print(html)

# 按字符串序列化html

result = etree.tostring(html).decode('utf-8')

print(result)

案例 2:从文件中读取 html 代码:

from lxml import etree

html = etree.parse('hello.html') #读取

# 按字符串序列化html

result = etree.tostring(html).decode('utf-8')

print(result)

案例 3:在 lxml 中使用 Xpath 语法

from lxml import etree

html = etree.parse('hello.html')

# 获取所有 li 标签:

# result = html.xpath('//li')

# print(result)

# for i in result:

#     print(etree.tostring(i))

# 获取所有li元素下的所有 class 属性的值:

# result = html.xpath('//li/@class')

# print(result)

# 获取 li 标签下 href 为https://www.w3cschool.cn/的 a 标签:

# result = html.xpath('//li/a[@href="https://www.w3cschool.cn/"]')

# print(result)

# 获取 li 标签下所有 span 标签:

# result = html.xpath('//li//span')

# print(result)

# 获取 li 标签下的 a 标签里的所有 class:

# result = html.xpath('//li/a//@class')

# print(result)

# 获取最后一个 li 的 a 的 href 属性对应的值:

# result = html.xpath('//li[last()]/a/@href')

# print(result)

# 获取倒数第二个 li 元素的内容:

# result = html.xpath('//li[last()-1]/a')

# print(result)

# print(result[0].text)

# 获取倒数第二个 li 元素的内容的第二种方式:

result = html.xpath('//li[last()-1]/a/text()')

print(result)

总结:

      纸上得来终觉浅,绝知此事要躬行,一份耕耘,一份收获。

推荐好课:Python 静态爬虫Python Scrapy网络爬虫