1、引言
在Python網(wǎng)絡(luò)爬蟲內(nèi)容提取器一文我們?cè)敿?xì)講解了核心部件:可插拔的內(nèi)容提取器類gsExtractor。本文記錄了確定gsExtractor的技術(shù)路線過(guò)程中所做的編程實(shí)驗(yàn)。這是第一部分,實(shí)驗(yàn)了用xslt方式一次性提取靜態(tài)網(wǎng)頁(yè)內(nèi)容并轉(zhuǎn)換成xml格式。
2、用lxml庫(kù)實(shí)現(xiàn)網(wǎng)頁(yè)內(nèi)容提取
lxml是python的一個(gè)庫(kù),可以迅速、靈活地處理 XML。它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且實(shí)現(xiàn)了常見(jiàn)的 ElementTree API。
這2天測(cè)試了在python中通過(guò)xslt來(lái)提取網(wǎng)頁(yè)內(nèi)容,記錄如下:
2.1、抓取目標(biāo)
假設(shè)要提取集搜客官網(wǎng)舊版論壇的帖子標(biāo)題和回復(fù)數(shù),如下圖,要把整個(gè)列表提取出來(lái),存成xml格式

2.2、源代碼1:只抓當(dāng)前頁(yè),結(jié)果顯示在控制臺(tái)
Python的優(yōu)勢(shì)是用很少量代碼就能解決一個(gè)問(wèn)題,請(qǐng)注意下面的代碼看起來(lái)很長(zhǎng),其實(shí)python函數(shù)調(diào)用沒(méi)有幾個(gè),大篇幅被一個(gè)xslt腳本占去了,在這段代碼中,只是一個(gè)好長(zhǎng)的字符串而已,至于為什么選擇xslt,而不是離散的xpath或者讓人撓頭的正則表達(dá)式,請(qǐng)參看《Python即時(shí)網(wǎng)絡(luò)爬蟲項(xiàng)目啟動(dòng)說(shuō)明》,我們期望通過(guò)這個(gè)架構(gòu),把程序員的時(shí)間節(jié)省下來(lái)一大半。
可以拷貝運(yùn)行下面的代碼(在windows10, python3.2下測(cè)試通過(guò)):
from urllib import request from lxml import etree url="http://www.gooseeker.com/cn/forum/7" conn = request.urlopen(url) doc = etree.HTML(conn.read()) xslt_root = etree.XML("""/ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > <xsl:template match="/"> <列表> <xsl:apply-templates select="http://*[@id='forum' and count(./table/tbody/tr[position()>=1 and count(.//*[@class='topic']/a/text())>0])>0]" mode="列表"/> </列表> </xsl:template> <xsl:template match="table/tbody/tr[position()>=1]" mode="list"> <item> <標(biāo)題> <xsl:value-of select="*//*[@class='topic']/a/text()"/> <xsl:value-of select="*[@class='topic']/a/text()"/> <xsl:if test="@class='topic'"> <xsl:value-of select="a/text()"/> </xsl:if> </標(biāo)題> <回復(fù)數(shù)> <xsl:value-of select="*//*[@class='replies']/text()"/> <xsl:value-of select="*[@class='replies']/text()"/> <xsl:if test="@class='replies'"> <xsl:value-of select="text()"/> </xsl:if> </回復(fù)數(shù)> </item> </xsl:template> <xsl:template match="http://*[@id='forum' and count(./table/tbody/tr[position()>=1 and count(.//*[@class='topic']/a/text())>0])>0]" mode="列表"> <item> <list> <xsl:apply-templates select="table/tbody/tr[position()>=1]" mode="list"/> </list> </item> </xsl:template> </xsl:stylesheet>""") transform = etree.XSLT(xslt_root) result_tree = transform(doc) print(result_tree)
新聞熱點(diǎn)
疑難解答
圖片精選