国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python使用xslt提取網(wǎng)頁(yè)數(shù)據(jù)的方法

2020-02-22 23:17:24
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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)             
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 湘阴县| 荆州市| 桦川县| 翼城县| 沭阳县| 临夏市| 高青县| 孝感市| 泽普县| 兴城市| 遂昌县| 德令哈市| 阳谷县| 巫山县| 阿拉尔市| 新疆| 安阳县| 改则县| 凤凰县| 旬阳县| 惠来县| 墨玉县| 修武县| 灵台县| 连平县| 横山县| 广水市| 商洛市| 香港| 公主岭市| 石渠县| 巴里| 高密市| 巫山县| 丹东市| 凤翔县| 宁武县| 平度市| 天全县| 莱芜市| 龙岩市|