Python lxml获取和设置inner html
Python的lxml是一个相当强悍的解析html、XML的模块,最新版本支持的python版本从2.6到3.6,是写爬虫的必备利器。它基于C语言库libxml2 和 libxslt,进行了Python范儿(Pythonic)的绑定,成为一个具有丰富特性又容易使用的Python模块。虽然特性丰富,但是它在修改数节点时又缺少了些接口,比如本文讲到的获取 inner html 和 设置(修改)inner html功能。
解析网页的html一般使用lxml.html模块,步骤很简单分三步走:
(1) 导入模块:
import lxml.html
(2) 把html转换为html document 树,根节点就是标签:
doc = lxml.html.fromstring(html)
(3) 使用xpath查找要提取的节点:
nodes = doc.xpath('//div[@class, 'the']/div[@id, 'xpath']')
以上三步分成简洁,实际使用中,可能要反复第三部,通过不同的xpath获得不同的节点进行数据提取。
可以说,lxml解析(只读模式)html的功能又强大又方便。但是,如果需要修改(写模式)某些节点的html就有点困难了,它在这方面提供的API很少,只有修改节点tag属性的API,比如修改节点的class,id,href等属性是可以的。
那么如何操作节点的实际html字符串呢?
- 获取节点的inner html
那么,什么是inner html呢?首先,我们来看一段html代码示例:
对于div 这个html标签节点,它的inner html就是:
这是div节点内容
即该标签包含的所有内容;而包含div标签在内的全部示例代码就是div的outer html。
明白了inner html 和 outer html的概念,我们就着手获取它们。
lxml.html.tostring(html_element) 接口的作用是把一个节点及其子节点形成的树转换成html,也就是该节点的outer html,由此我们来获得inner html,并实现为以下函数:
def get_inner_html(node): html = lxml.html.tostring(node, encoding="utf8").decode('utf8') p_begin = html.find('>') + 1 p_end = html.rfind('<') return html[p_begin: p_end]
- 设置节点的inner html
设置inner html相较于获取更复杂一些,我们还是以上面那段html代码为例:
假设我们要把它的inner html 改成如下字符串:
this is divnodetext
则操作步骤是:
清空节点div里面的内容:包括它的text和子节点
把新的inner html转变成fragments
把fragments加到清空后的div节点
把以上步骤写出Python函数就是:
def set_inner_html(node, html): node.text = '' for child in node.getchildren(): node.remove(child) 4 fragments = lxml.html.fragments_fromstring(html) if type(fragments[0]) == str: node.text = fragments.pop(0) node.extend(fragments)
通过以上函数就可以成功把node里面的内容设置成想要的html内容,适合在动态修改网页结构内容时使用。
版权申明:若没有特殊说明,文章皆是猿人学原创,没有猿人学授权,请勿以任何形式转载。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
封装了一个对mysql进行异步IO的小工具
SanicDB 是为 Python的异步 Web 框架 Sanic 方便操作MySQL而开发的工具,是对 aiomysql.Pool 的轻量级封装。Sanic 是异步IO的Web框架,同时用异步IO读写MySQL才能更大发挥它的效率。虽然这个模块叫做 SanicDB,但是它可以用在任何异步IO操作MySQL的地方。 SanicDB的灵感来源于tornado里面的对MySQLdb(MySQL的C语言接口的Python封装)的操作,后来tornado把它去除了,就有人把这部分代码写成一个单独的模块叫做 torndb,torndb是对python-mysql的封装,不能进行异步操作。但是它很简洁,用起来已经非常习惯了。 在用Sanic的时候,发现有异步IO的aiomysql可以用,但是用起来还有点麻烦,于是就着手对aiomysql进行封装,既然aiomysql支持连接池,那就直接封装aiomysql.Pool吧。 代码仓库: https://github.com/veelion/sanicdb 首先,看看它的初始化 class SanicDB: """A lightweight wrappe...
- 下一篇
使用Python实现自动化截取Windows系统屏幕
自动化截屏有什么用呢?为什么要实现自动化截屏呢?其实,在某些特殊的场景下,记录电脑使用者的操作还是很有必要的。比如,银行记录柜员日常操作当作日后规范流程的数据,或者是日后存证;再比如,作为家长记录孩子使用电脑的情况等。 截屏功能的实现 Python有个第三方模块叫做PIL(Python 3中PIL停止开发,fork了一个新分支叫Pillow来支持Py3),是用来进行图像处理的,比如,改变图片颜色,进行图片缩放,图片裁剪等等基本图片操作。巧的是,它就包含一个截屏的功能,而且使用起来非常简单,两三行代码即可搞定: im = ImageGrab.grab() im.save('path-to-save','png') 不巧的是,它只支持Windows和Mac系统,Linux下面却不能用 自动化不间断截屏 有了上面简洁的截屏功能,我们可以把它打包成一个简单的函数叫做make_shot(),每次截屏存储为当前时间命名的图片,一天24小时不间断截屏。 import time def main(): while 1: make_shot() time.sleep(60) # 60秒截一次屏 # 这里...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库