python第三方网页解析器 lxml 扩展库与 xpath 的使用方法


Posted in Python onApril 06, 2021

今天说的则是使用另外一种扩展库 lxml 来对网页完成解析。同样的,lxml 库能完成对 html、xml 格式的文件解析,并且能够用来解析大型的文档、解析速度也是相对比较快的。

要掌握 lxml 的使用,就需要掌握掌握 xpath 的使用方法,因为 lxml 扩展库就是基于 xpath 的,所以这一章的重点主要还是对 xpath 语法使用的说明。

1、导入 lxml 扩展库、并创建对象

# -*- coding: UTF-8 -*-

# 从 lxml 导入 etree
from lxml import etree

# 首先获取到网页下载器已经下载到的网页源代码
# 这里直接取官方的案例
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" rel="external nofollow" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" rel="external nofollow" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" rel="external nofollow" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

# 初始化网页下载器的 html_doc 字符串,返回一个 lxml 的对象
html = etree.HTML(html_doc)

2、使用 xpath 语法提取网页元素

按照节点的方式获取元素

# xpath() 使用标签节点的方式获取元素
print html.xpath('/html/body/p')
# [<Element p at 0x2ebc908>, <Element p at 0x2ebc8c8>, <Element p at 0x2eb9a48>]
print html.xpath('/html')
# [<Element html at 0x34bc948>]
# 在当前节点的子孙节点中查找 a 节点
print html.xpath('//a')
# 在当前节点的子节点中查找 html 节点
print html.xpath('/html')

按照筛选的方式获取元素

'''
根据单一属性获取元素
'''
# 获取子孙节点中,属性 class=bro 的 a 标签
print html.xpath('//a[@class="bro"]')

# 获取子孙节点中,属性 id=link3 的 a 标签
print html.xpath('//a[@id="link3"]')

'''
根据多个属性获取元素
'''
# 获取class属性等于sister,并且id等于link3的a标签
print html.xpath('//a[contains(@class,"sister") and contains(@id,"link1")]')

# 获取class属性等于bro,或者id等于link1的a标签
print html.xpath('//a[contains(@class,"bro") or contains(@id,"link1")]')

# 使用 last() 函数,获取子孙代的a标签的最后一个a标签
print html.xpath('//a[last()]')
# 使用 1 函数,获取子孙代的a标签的第一个a标签
print html.xpath('//a[1]')
# 标签筛选,position()获取子孙代的a标签的前两个a标签
print html.xpath('//a[position() < 3]')

'''
使用计算的方式,获取多个元素
'''
# 标签筛选,position()获取子孙代的a标签的第一个与第三个标签
# 可以使用的计算表达式:>、<、=、>=、<=、+、-、and、or
print html.xpath('//a[position() = 1 or position() = 3]')

获取元素的属性与文本

'''
使用@获取属性值,使用text() 获取标签文本
'''
# 获取属性值
print html.xpath('//a[position() = 1]/@class')
# ['sister']
# 获取标签的文本值
print html.xpath('//a[position() = 1]/text()')

到此这篇关于python 网页解析器掌握第三方 lxml 扩展库与 xpath 的使用方法的文章就介绍到这了,更多相关python lxml 扩展库与 xpath内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python简单的函数定义和用法实例
May 07 Python
Python实现简单字典树的方法
Apr 29 Python
Python类属性的延迟计算
Oct 22 Python
python 查找字符串是否存在实例详解
Jan 20 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
Python提取特定时间段内数据的方法实例
Apr 01 Python
python的range和linspace使用详解
Nov 27 Python
python-OpenCV 实现将数组转换成灰度图和彩图
Jan 09 Python
Python Selenium参数配置方法解析
Jan 19 Python
Python实现结构体代码实例
Feb 10 Python
你需要学会的8个Python列表技巧
Jun 24 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
python删除csv文件的行列
Apr 06 #Python
python使用pygame创建精灵Sprite
python 逐步回归算法
python 通过使用Yolact训练数据集
python生成随机数、随机字符、随机字符串
Apr 06 #Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 #Python
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
You might like
利用PHP创建动态图像
2006/10/09 PHP
PHP大批量数据操作时临时调整内存与执行时间的方法
2011/04/20 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
PHP获取当前执行php文件名的代码
2017/03/02 PHP
jquery 双色表格实现代码
2009/12/08 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
2013/10/28 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
js日期联动示例
2014/05/02 Javascript
使用GruntJS构建Web程序之合并压缩篇
2014/06/06 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
基于BootStrap Metronic开发框架经验小结【二】列表分页处理和插件JSTree的使用
2016/05/12 Javascript
Javascript之Date对象详解
2016/06/07 Javascript
功能强大的Bootstrap使用手册(一)
2016/08/02 Javascript
在线引用最新jquery文件的实现方法
2016/08/26 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
微信跳一跳python代码实现
2018/01/05 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
python__new__内置静态方法使用解析
2020/01/07 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
奥地利网上书店:Weltbild
2017/07/14 全球购物
工业设计专业自荐书
2014/06/05 职场文书
建党伟业的观后感
2015/06/01 职场文书
决心书格式及范文
2019/06/24 职场文书
导游词之湖州-太湖
2019/10/11 职场文书
500字作文之关于爸爸
2019/11/14 职场文书
Redis IP地址的绑定的实现
2021/05/08 Redis
Python入门之基础语法详解
2021/05/11 Python