亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

回顧

在《Python/ target=_blank class=infotextkey>Python進(jìn)階記錄之urllib模塊》中,我們介紹了Python內(nèi)置的HTTP請求庫urllib模塊的基本用法,需要重點掌握使用urllib的request模塊進(jìn)行簡單的get、post請求。今天我們講一下Python內(nèi)置的html解析庫HTMLParser模塊,并結(jié)合之前的re模塊和urllib模塊實現(xiàn)爬取指定新聞頁提取新聞文本內(nèi)容的小需求。

HTMLParser模塊簡介

我們使用urllib模塊進(jìn)行HTTP請求獲取到的是整個網(wǎng)頁的HTML,但是我們往往只需要其中一部分對我們有用的內(nèi)容。這時我們就可以使用HTMLParser模塊來幫助我們處理HTML。

HTMLParser是Python內(nèi)置的專門用來解析HTML的模塊。利用HTMLParser,我們可以分析出一段HTML里面的標(biāo)簽、數(shù)據(jù)等,是一種處理HTML的簡便途徑。我們先來看一個官方的例子。

Python進(jìn)階記錄之HTMLParser模塊

HTMLParser模塊官方例子

從上述代碼中可以看出,HTMLParser模塊來自html.parser,導(dǎo)包時要格外注意。使用HTMLParser時,我們需要定義一個繼承自HTMLParser的子類,并根據(jù)需要重寫HTMLParser父類中的成員方法。例子中使用的各方法作用如下:

handle_starttag(tag, attrs):識別HTML的開始標(biāo)簽,例如<html>、<title>、<body>、<div>等。

handle_endtag(tag):識別HTML的結(jié)束標(biāo)簽,例如</html>、</body>、</div>、</p>等。

handle_data(data):識別HTML標(biāo)簽內(nèi)容,例如“<p>Test</p>”中的Test。

handle_startendtag(tag, attrs):識別沒有結(jié)束標(biāo)簽的HTML標(biāo)簽,例如<img />等。

handle_comment(data):識別HTML中的注釋內(nèi)容,一般是“<!-- 注釋 -->”中的注釋內(nèi)容。

HTMLParser采用的是一種事件驅(qū)動的模式,HTMLParser找到一個特定的標(biāo)記時,它會去調(diào)用一個用戶定義的函數(shù),以此來通知程序處理。

我們可以利用這些方法來實現(xiàn)HTML解析相關(guān)的功能。其中參數(shù)tag表示的是HTML標(biāo)簽,attrs是一個列表,列表元素為一個個“(屬性,值)”形式的元組。HTMLParser會自動將tag和attrs都轉(zhuǎn)為小寫,解析時調(diào)用feed( )方法,把待解析的HTML字符串傳入即可。

HTMLParser模塊的簡單應(yīng)用

現(xiàn)在有以下網(wǎng)頁,我們需要獲取出里面的新聞文本內(nèi)容。

Python進(jìn)階記錄之HTMLParser模塊

待請求網(wǎng)頁

首先就是獲取該網(wǎng)頁的HTML。經(jīng)過上節(jié)內(nèi)容的學(xué)習(xí),我們很容易想到利用urllib庫請求獲取這個網(wǎng)頁的HTML。

Python進(jìn)階記錄之HTMLParser模塊

獲取網(wǎng)頁HTML

代碼很簡單,使用urlopen( )方法,傳入url即可。此時,我們已經(jīng)得到了整個網(wǎng)頁的HTML,但是我們要獲取的是新聞內(nèi)容,顯然此時的HTML中有太多我們不需要的東西。

觀察整個網(wǎng)頁HTML,我們發(fā)現(xiàn)新聞內(nèi)容是包含在一個div中的。

Python進(jìn)階記錄之HTMLParser模塊

新聞內(nèi)容相關(guān)HTML

我們可以使用正則表達(dá)式re模塊將包含新聞內(nèi)容的這個div提取出來。

Python進(jìn)階記錄之HTMLParser模塊

提取新聞內(nèi)容相關(guān)的HTML

新聞內(nèi)容的div格式主要是:<div class="article-content">...</div>。由于該div下嵌套了其他div,如果我們直接使用r'<div class="article-content">(.*?)</div>'進(jìn)行正則提取,會發(fā)現(xiàn)在下一個</div>處就截斷了。為了正確提取所有新聞內(nèi)容相關(guān)的HTML,我們需要在</div>前加一個</p>,以保證是在新聞內(nèi)容結(jié)束的</div>處截斷。

此時,我們已經(jīng)得到了新聞內(nèi)容相關(guān)的HTML。現(xiàn)在還剩最后一部,就是把HTML標(biāo)簽去掉,保留新聞文本內(nèi)容。這一步,我們就可以利用HTMLParser來實現(xiàn)了。

Python進(jìn)階記錄之HTMLParser模塊

HTMLParser提取新聞內(nèi)容

我們定義一個繼承自HTMLParser的子類,然后重寫handle_data(data)方法獲取當(dāng)前HTML中的文本內(nèi)容即可。由于我們定義的私有變量__text是通過一個列表來逐條接收新聞內(nèi)容的,所以我們在類中定義一個獲取私有變量__text的方法,并將列表轉(zhuǎn)換成字符串。至此,我們已經(jīng)獲取到了新聞的文本內(nèi)容。

然而,當(dāng)前文本內(nèi)容一整段在一起,看起來并不美觀,與實際分段的新聞文本內(nèi)容也有差別。我們可以使用HTMLParser來美化新聞內(nèi)容。我們知道,網(wǎng)頁上的新聞內(nèi)容是通過“n”、“t”、“<br/>”等特殊符號或標(biāo)簽進(jìn)行間隔和分段的。因此,我們只需要在解析時替換掉這些特殊符號和標(biāo)簽即可。

Python進(jìn)階記錄之HTMLParser模塊

替換特殊符號和標(biāo)簽

重寫handle_data(data)方法,識別文本的同時替換掉“t”、“r”、“n”等特殊字符;重寫handle_starttag(tag, attrs)方法,識別出<p>、<br>進(jìn)行替換;重寫handle_startendtag(tag, attrs)方法,識別出<br/>進(jìn)行替換。再次運行程序,可以看到,新聞內(nèi)容進(jìn)行了分段,看起來就美觀多了。

上述過程實現(xiàn)了一個非常簡單的爬蟲,爬取新聞網(wǎng)頁,提取新聞內(nèi)容。當(dāng)然,由于我們目前還沒介紹其他第三方庫,實現(xiàn)起來還不夠靈活,例如獲取新聞內(nèi)容的div我們現(xiàn)在只能通過正則表達(dá)式實現(xiàn),但實際上,如果使用lxml(etree、xpath)、BeautifulSoup等第三方庫會更簡單實用。

總結(jié)

以上內(nèi)容介紹了Python內(nèi)置的HTML解析庫HTMLParser模塊,需要重點掌握HTMLParser類常用方法的作用,能夠重寫這些方法進(jìn)行自定義解析。感謝大家的支持與關(guān)注,歡迎一起學(xué)習(xí)交流~

分享到:
標(biāo)簽:模塊 HTMLParser
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達(dá)人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定