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

解析網頁的html通常使用lxml.html模塊,步驟很簡單分三步走:node

(1) 導入模塊:python

import lxml.html函數

(2) 把html轉換爲html document 樹,根節點就是<html>標籤:this

doc = lxml.html.fromstring(html)spa

(3) 使用xpath查找要提取的節點:code

nodes = doc.xpath('//div[@class, 'the']/div[@id, 'xpath']')xml

以上三步分紅簡潔,實際使用中,可能要反覆第三部,經過不一樣的xpath得到不一樣的節點進行數據提取。htm

能夠說,lxml解析(只讀模式)html的功能又強大又方便。可是,若是須要修改(寫模式)某些節點的html就有點困難了,它在這方面提供的API不多,只有修改節點tag屬性的API,好比修改節點的class,id,href等屬性是能夠的。blog

那麼如何操做節點的實際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技術文章能夠看 猿人學 

相關文章
相關標籤/搜索