Python爬虫解析htm时lxml的HtmlElement对象获取和设置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 树,根节点就是<html>标签:
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 class=”text”>这是div<a href=”/node”>节点</a>内容</div>
对于div 这个html标签节点,它的inner html就是:
这是div<a href=”/node”>节点</a>内容
即该标签包含的所有内容;而包含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]
2. 设置节点的inner html
设置inner html相较于获取更复杂一些,我们还是以上面那段html代码为例:
<div class=”text”>这是div<a href=”/node”>节点</a>内容</div>
假设我们要把它的inner html 改成如下字符串:
this is div<a href=”/node”>node</a>text
则操作步骤是:
清空节点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内容,适合在动态修改网页结构内容时使用。
更多Python技术文章可以看 猿人学
Python爬虫解析htm时lxml的HtmlElement对象获取和设置inner html方法的更多相关文章
- Python爬虫解析网页的4种方式 值得收藏
用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存 ...
- python语法学习第十天--类与对象相关的BIF、魔法方法
一些相关的BIF: issubclass(class,classInfo)#判断是否为子类,classInfo可以为多个类的元组,其中一个是,返回true,一个类也被认为是自己的子类,object是所 ...
- python爬虫中XPath和lxml解析库
什么是XML XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 的标签需要 ...
- python bs4解析网页时 bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to inst(转)
Python小白,学习时候用到bs4解析网站,报错 bs4.FeatureNotFound: Couldn't find a tree builder with the features you re ...
- Python 爬虫 解析库的使用 --- XPath
一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...
- Python 爬虫 解析库的使用 --- Beautiful Soup
知道了正则表达式的相关用法,但是一旦正则表达式写的有问题,得到的可能就不是我们想要的结果了.而且对于一个网页来说,都有一定的特殊结构和层级关系,而且有很多节点都有id或class来做区分,所以借助它们 ...
- python爬虫解析页面数据的三种方式
re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...
- python爬虫解析库之Beautifulsoup模块
一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会 ...
- Python爬虫 XPath语法和lxml模块
XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...
随机推荐
- StringJoiner,StringBuffer的一些lamada写法
public String friendlyText(List data) { if(CollectionUtils.isEmpty(data)) { return "[]"; } ...
- 手写web框架之加载Controller,初始化框架
1,加载Controller 我们需要创建 一个ControllerHelper类,让它来处理下面的逻辑: 通过ClassHelper我们可以获取所有定义了Controller注解的 ...
- DevOps - 构建本地开发环境
1 - 构建个人本地开发环境 在个人计算机中搭建一个精简版的.与生产环境基本一致的本地开发环境,既不会占用团队公共环境的资源,也可以缩短等待时间,从整体上提高效率. 本地开发环境的适用场景: 从应用程 ...
- CentOS7.5下,MySQL安装配置指南
[root@host---- home]# grep 'temporary password' /var/log/mysqld.log --20T02::.457613Z [Note] A tempo ...
- Element-UI 框架 el-scrollbar 组件
Element-UI 框架 el-scrollbar 组件:https://juejin.im/post/5c83d5ac5188257e1c4dc9e7
- Parse Lisp Expression
You are given a string expression representing a Lisp-like expression to return the integer value of ...
- 【LOJ】#2983. 「WC2019」数树
LOJ2983. 「WC2019」数树 task0 有\(i\)条边一样答案就是\(y^{n - i}\) task1 这里有个避免容斥的方法,如果有\(i\)条边重复我们要算的是\(y^{n - i ...
- mybatis-plus配置多数据源invalid bound statement (not found)
mybatis-plus配置多数据源invalid bound statement (not found) 错误原因 引入mybatis-plus应该使用的依赖如下,而不是mybatis <de ...
- 黑科技——树剖两次dfs转一次dfs!
黑科技--树剖两次\(dfs\)转一次\(dfs\)! 重所周知,树链剖分通常是要\(dfs\)两次的,就像这样: int Fa[N],dep[N],Sz[N],son[N]; void dfs1( ...
- LC 155 Min Stack
问题描述 Design a stack that supports push, pop, top, and retrieving the minimum element in constant tim ...