开发者社区> xiaoyuaner> 正文

Python lxml获取和设置inner html

简介: Python的lxml是一个相当强悍的解析html、XML的模块,最新版本支持的python版本从2.6到3.6,是写爬虫的必备利器。它基于C语言库libxml2 和 libxslt,进行了Python范儿(Pythonic)的绑定,成为一个具有丰富特性又容易使用的Python模块。
+关注继续查看

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字符串呢?

  1. 获取节点的inner html

那么,什么是inner html呢?首先,我们来看一段html代码示例:

这是div节点内容

对于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]
  1. 设置节点的inner html

设置inner html相较于获取更复杂一些,我们还是以上面那段html代码为例:

这是div节点内容

假设我们要把它的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内容,适合在动态修改网页结构内容时使用。

版权申明:若没有特殊说明,文章皆是猿人学原创,没有猿人学授权,请勿以任何形式转载。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
HTML设置网页图标标志
本文目录 1. 网页图标标志 2. 实现
50 0
HTML的div标记为何设置背景色无效?
HTML的div标记为何设置背景色无效?
61 0
Ubuntu中设置环境变量PATH
Ubuntu中设置环境变量PATH二种方法 时间:2008-11-06 00:00 来源:网管之家bitsCN.com 字体:[大 中 小]     目前在Ubuntu中有二种设置PATH环境变量的方法。
500 0
2.4 PyCharm设置参数
在运行脚本或者代码的时候,可能会需要传入一个或多个参数,直接在命令后面添加较麻烦,那么怎样在 PyCharm 里面预先设置好参数呢? 首先我们打开一个 python 文件,使用 "ctrl+/" 注释原有的内容,添加新的需要传参代码,如下: 然后我们会发现 sys 是有...
1592 0
安装完Python之后,如何设置Python环境变量
人生苦短,我用Python。最近有许多加群的萌新在咨询Python安装的事宜,Python安装问题不大,可以戳这篇文章:。本以为安装Python之后就可以万事大吉,高枕无忧了,往命令行中输入python,发现有下图的错误。
1060 0
仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)
转载请说明原出处,谢谢~~        花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观。现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了。
995 0
html中label宽度设置、非替换元素和替换元素
单独对label设置一个width:100px的属性石不起作用的,和float:left或者display:inline-block配合的话 都可以设置上 参考:css position, display, float 内联元素、块级元素 在 CSS 中,任何元素都可以float浮动。
959 0
获取并设置HTML5 Video的当前进度
上周翻译了一篇文章: 如何获取HTML5视频的持续时间。很显然这是一门简单却很实用的技术, 但我认为还有一个更重要的知识点是控制视频的时间设置。在用HTML5技术处理视频时,设置(setting)和获取(getting)时间都是很有用的,那就让我们一起来看看如何达成这个 目标吧! 在管理视频状态时,最重要的是要了解 currentTime 是个什么鬼。
1080 0
+关注
20
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载