天天看點

python爬蟲提取a标簽_Python爬蟲解析html:擷取節點的inner html

跟着猿人學python,記錄我的python學習之旅。

在我們寫爬蟲的時候經常會遇到這樣那樣的問題。常見的是網頁解析,如何利用工具更好的去幫我們提高效率,是我最近學習的重點。

python爬蟲提取a标簽_Python爬蟲解析html:擷取節點的inner html

Python的lxml是一個相當強悍的解析html、XML的子產品,最新版本支援的python版本從2.6到3.6,是寫爬蟲的必備利器。它基于C語言庫libxml2 和 libxslt,進行了Python範兒(Pythonic)的綁定,成為一個具有豐富特性又容易使用的Python子產品。雖然特性豐富,但是它在修改數節點時又缺少了些接口,比如本文講到的擷取 inner html 和 設定(修改)inner html功能。

python爬蟲提取a标簽_Python爬蟲解析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]