Python爬虫——XPath解析本地html文件

1、XPath 简介

XPath:XML路径语言(XML Path Language),XPath作用是确定XML文档中某部分的位置,同时它也可以用于检索 HTML 文件。在使用爬虫过程中可以用 XPath 来爬取网页中想要的数据。

Xpath 可以理解为在 XML/HTML 文档中对元素和属性进行遍历的工具。

Xpath 使用简洁的路径表达式来匹配 XML/HTML 文档中的节点或者节点集,通过定位网页中的节点,从而找到我们需要的数据。

Xpath 提供了100 多个内建函数,包括了处理字符串、数值、日期以及时间的函数。因此 Xpath 路径表达式几乎可以匹配所有的元素节点。

Xpath 路径表达式跟电脑文件夹目录、网址的url相似,用 / 来表示路径的深度。

XPath插件的下载安装

chrome插件XPATH HelPer 下载地址:

链接:https://pan.baidu.com/s/1cx5Q42aJs1mky1qSZQYObA?pwd=sesp

提取码:sesp

下载XPATH HelPer插件,把下载文件的后缀名改为.zip;

打开谷歌浏览器,进入扩展程序,打开开发者模式,把XPATH HelPer插件拉进扩展程序界面,自动进行安装:

在这里插入图片描述

打开XPATH HelPer插件快捷键:CTRL+SHIFT+X,

打开后浏览器上方会出现使用 XPATH 插件的窗口:

在这里插入图片描述

2、下载 lxml

第三方解析库 lxml是一款高性能的 Python HTML/XML 解析器, 对 Xpath 路径表达式提供了良好的支持,主要的功能是利用XPath语法解析和提取 HTML/XML 数据。

1、lxml安装位置:Python安装目录的Scripts文件夹下

2、安装命令:pip install lxml -i https://pypi.douban.com/simple,如下图则安装成功:

在这里插入图片描述

3、XPath解析本地 html 文件

XPath路径表达式:

表达式描述
node_name(节点名)选取此节点的所有子节点
/查找当前节点的子节点
//查找当前节点的所有子孙节点,不考虑层级关系
.选取当前节点
选取当前节点的父节点
@选取属性值,通过属性值选取数据。常用元素属性有 @id 、@name、@value、@type、@class、@tittle、@href

编写本地html文件:xpath_local.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
</head>
<body>
    <ul>
        <li id="name" class="bookName">法治的细节</li>
        <li id="model">纸质书</li>
        <li class="price">30元</li>
        <li class="author">罗翔</li>
    </ul>
</body>
</html>

路径查询:

解析实例:查找 ul 标签下的 li 标签

from lxml import etree
#解析本地文件使用 etree.parse
tree = etree.parse('xpath_local.html')

list1 = tree.xpath('//body/ul/li')
#返回标签内容 text()
list2 = tree.xpath('//body/ul/li/text()')
list3 = tree.xpath('//body//li/text()')
print(list1)
print(list2)
print(list3)

执行结果:

[<Element li at 0x22908641e88>, <Element li at 0x22908641f88>, <Element li at 0x22908641fc8>, <Element li at 0x22908655048>]
['法治的细节', '纸质书', '30元', '罗翔']
['法治的细节', '纸质书', '30元', '罗翔']

谓词查询:

解析实例:查找有id属性的li标签

from lxml import etree

tree = etree.parse('xpath_local.html')

list1 = tree.xpath('//body/ul/li[@id]/text()')
print(list1)

执行结果:

['法治的细节', '纸质书']

属性查询:

解析实例:查找id属性为"name"的li标签

from lxml import etree

tree = etree.parse('xpath_local.html')

list1 = tree.xpath('//body/ul/li[@id="name"]/text()')
print(list1)

执行结果:

['法治的细节']

解析实例:查找id为"name"的 li 标签的class属性的数据

from lxml import etree

tree = etree.parse('xpath_local.html')

list1 = tree.xpath('//body/ul/li[@id="name"]/@class')
print(list1)

执行结果:

['bookName']

模糊查询:

解析实例:查找id属性值包含"a"的 li 标签

from lxml import etree

tree = etree.parse('xpath_local.html')

list1 = tree.xpath('//ul/li[contains(@id,"a")]/text()')
print(list1)

执行结果:

['法治的细节']

解析实例:查找id属性值以"m"为开头的 li 标签

from lxml import etree

tree = etree.parse('xpath_local.html')

list1 = tree.xpath('//ul/li[starts-with(@id,"m")]/text()')
print(list1)

执行结果:

['纸质书']
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐