Python的lxml是一个至关强悍的解析html、XML的模块,最新版本支持的python版本从2.6到3.6,是写爬虫的必备利器。它基于C语言库libxml2 和 libxslt,进行了Python范儿(Pythonic)的绑定,成为一个具备丰富特性又容易使用的Python模块。虽然特性丰富,可是它在修改数节点时又缺乏了些接口,好比本文讲到的获取 inner html 和 设置(修改)inner html功能。node
解析网页的html通常使用lxml.html模块,步骤很简单分三步走:python
(1) 导入模块:python爬虫
import lxml.html
函数
(2) 把html转换为html document 树,根节点就是<html>标签:this
doc = lxml.html.fromstring(html)
spa
(3) 使用xpath查找要提取的节点:.net
nodes = doc.xpath('//div[@class, 'the']/div[@id, 'xpath']')
code
以上三步分红简洁,实际使用中,可能要反复第三部,经过不一样的xpath得到不一样的节点进行数据提取。xml
能够说,lxml解析(只读模式)html的功能又强大又方便。可是,若是须要修改(写模式)某些节点的html就有点困难了,它在这方面提供的API不多,只有修改节点tag属性的API,好比修改节点的class,id,href等属性是能够的。
那么如何操做节点的实际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]
设置inner html相较于获取更复杂一些,咱们仍是以上面那段html代码为例:
<div class=”text”>这是div<a href=”/node”>节点</a>内容</div>
假设咱们要把它的inner html 改为以下字符串:
this is div<a href=”/node”>node</a>text
则操做步骤是:
把以上步骤写出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内容,适合在动态修改网页结构内容时使用。