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内容,适合在动态修改网页结构内容时使用。

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

目录
相关文章
|
17天前
|
数据挖掘 数据处理 索引
python str.extract提取小数+表inner内连接后,行数多于之前
python str.extract提取小数+表inner内连接后,行数多于之前
21 0
python str.extract提取小数+表inner内连接后,行数多于之前
|
4月前
|
测试技术 Python
Selenium+python之HTML测试报告
Selenium+python之HTML测试报告
63 1
|
5月前
|
开发框架 JSON 数据可视化
Python Flask Echarts数据可视化图表实战晋级笔记(1)HTML页面渲染与参数传递
Python Flask Echarts数据可视化图表实战晋级笔记(1)HTML页面渲染与参数传递
86 1
|
8月前
|
Python
Python 基于lxml.etree实现xpath查找HTML元素
Python 基于lxml.etree实现xpath查找HTML元素
86 0
|
8月前
|
数据采集 XML 前端开发
Python爬虫:scrapy内置网页解析库parsel-通过css和xpath解析xml、html
Python爬虫:scrapy内置网页解析库parsel-通过css和xpath解析xml、html
105 0
|
10月前
|
Linux Python
Python编程:使用wkhtmltopdf将html网页转成pdf文件
Python编程:使用wkhtmltopdf将html网页转成pdf文件
104 0
Python编程:使用wkhtmltopdf将html网页转成pdf文件
|
11月前
|
测试技术
python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(优化版)
python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(优化版)
231 0
python+requests+excel+unittest+ddt接口自动化数据驱动并生成html报告(优化版)
|
11月前
|
前端开发 JavaScript Python
HTML引入Python脚本
本文介绍一种向HTML中直接引入Python脚本的方法。
196 0
|
11月前
|
存储 SQL 关系型数据库
Python玩转阿里云OSS对象存储,批量转存markdown和html图片
Python玩转阿里云OSS对象存储,批量转存markdown和html图片
|
12月前
|
Linux Python
python脚本,从mongo取数据发送html格式表格邮件
python脚本,从mongo取数据发送html格式表格邮件
109 0
相关产品
云迁移中心
推荐文章
更多