日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python爬虫解析html:lxml的HtmlElement对象获取和设置inner html

發(fā)布時(shí)間:2025/4/16 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python爬虫解析html:lxml的HtmlElement对象获取和设置inner html 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

我在我的個(gè)人博客“猿人學(xué)網(wǎng)站”和公眾號(hào)“猿人學(xué)Python”上寫(xiě)Python教程,有興趣的可以關(guān)注公眾號(hào)和網(wǎng)站。

Python的lxml是一個(gè)相當(dāng)強(qiáng)悍的解析html、XML的模塊,最新版本支持的python版本從2.6到3.6,是寫(xiě)爬蟲(chóng)的必備利器。它基于C語(yǔ)言庫(kù)libxml2 和 libxslt,進(jìn)行了Python范兒(Pythonic)的綁定,成為一個(gè)具有豐富特性又容易使用的Python模塊。雖然特性豐富,但是它在修改數(shù)節(jié)點(diǎn)時(shí)又缺少了些接口,比如本文講到的獲取 inner html 和 設(shè)置(修改)inner html功能。

解析網(wǎng)頁(yè)的html一般使用lxml.html模塊,步驟很簡(jiǎn)單分三步走:

(1) 導(dǎo)入模塊:

import lxml.html

(2) 把html轉(zhuǎn)換為html document 樹(shù),根節(jié)點(diǎn)就是<html>標(biāo)簽:

doc = lxml.html.fromstring(html)

(3) 使用xpath查找要提取的節(jié)點(diǎn):

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

以上三步分成簡(jiǎn)潔,實(shí)際使用中,可能要反復(fù)第三部,通過(guò)不同的xpath獲得不同的節(jié)點(diǎn)進(jìn)行數(shù)據(jù)提取。

可以說(shuō),lxml解析(只讀模式)html的功能又強(qiáng)大又方便。但是,如果需要修改(寫(xiě)模式)某些節(jié)點(diǎn)的html就有點(diǎn)困難了,它在這方面提供的API很少,只有修改節(jié)點(diǎn)tag屬性的API,比如修改節(jié)點(diǎn)的class,id,href等屬性是可以的。

那么如何操作節(jié)點(diǎn)的實(shí)際html字符串呢?

1. 獲取節(jié)點(diǎn)的inner html

那么,什么是inner html呢?首先,我們來(lái)看一段html代碼示例:

<div class=”text”>這是div<a href=”/node”>節(jié)點(diǎn)</a>內(nèi)容</div>

對(duì)于div 這個(gè)html標(biāo)簽節(jié)點(diǎn),它的inner html就是:

這是div<a href=”/node”>節(jié)點(diǎn)</a>內(nèi)容

即該標(biāo)簽包含的所有內(nèi)容;而包含div標(biāo)簽在內(nèi)的全部示例代碼就是div的outer html。

明白了inner html 和 outer html的概念,我們就著手獲取它們。

lxml.html.tostring(html_element) 接口的作用是把一個(gè)節(jié)點(diǎn)及其子節(jié)點(diǎn)形成的樹(shù)轉(zhuǎn)換成html,也就是該節(jié)點(diǎn)的outer html,由此我們來(lái)獲得inner html,并實(shí)現(xiàn)為以下函數(shù):

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. 設(shè)置節(jié)點(diǎn)的inner html

設(shè)置inner html相較于獲取更復(fù)雜一些,我們還是以上面那段html代碼為例:

<div class=”text”>這是div<a href=”/node”>節(jié)點(diǎn)</a>內(nèi)容</div>

假設(shè)我們要把它的inner html 改成如下字符串:

this is div<a href=”/node”>node</a>text

則操作步驟是:

  • ?清空節(jié)點(diǎn)div里面的內(nèi)容:包括它的text和子節(jié)點(diǎn)
  • ?把新的inner html轉(zhuǎn)變成fragments
  • ?把fragments加到清空后的div節(jié)點(diǎn)
  • 把以上步驟寫(xiě)出Python函數(shù)就是:

    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)

    通過(guò)以上函數(shù)就可以成功把node里面的內(nèi)容設(shè)置成想要的html內(nèi)容,適合在動(dòng)態(tài)修改網(wǎng)頁(yè)結(jié)構(gòu)內(nèi)容時(shí)使用。

    轉(zhuǎn)載于:https://my.oschina.net/JUANererer/blog/3025003

    總結(jié)

    以上是生活随笔為你收集整理的Python爬虫解析html:lxml的HtmlElement对象获取和设置inner html的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。