Python爬虫解析html:lxml的HtmlElement对象获取和设置inner html
2019獨角獸企業重金招聘Python工程師標準>>>
我在我的個人博客“猿人學網站”和公眾號“猿人學Python”上寫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 樹,根節點就是<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
則操作步驟是:
把以上步驟寫出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內容,適合在動態修改網頁結構內容時使用。
轉載于:https://my.oschina.net/JUANererer/blog/3025003
總結
以上是生活随笔為你收集整理的Python爬虫解析html:lxml的HtmlElement对象获取和设置inner html的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter RichText支持自定
- 下一篇: requests记录