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

首頁 > 編程 > Python > 正文

python使用xslt提取網頁數(shù)據(jù)的方法

2020-01-04 15:48:25
字體:
來源:轉載
供稿:網友

1、引言

在Python網絡爬蟲內容提取器一文我們詳細講解了核心部件:可插拔的內容提取器類gsExtractor。本文記錄了確定gsExtractor的技術路線過程中所做的編程實驗。這是第一部分,實驗了用xslt方式一次性提取靜態(tài)網頁內容并轉換成xml格式。

2、用lxml庫實現(xiàn)網頁內容提取

lxml是python的一個庫,可以迅速、靈活地處理 XML。它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且實現(xiàn)了常見的 ElementTree API。

這2天測試了在python中通過xslt來提取網頁內容,記錄如下:

2.1、抓取目標

假設要提取集搜客官網舊版論壇的帖子標題和回復數(shù),如下圖,要把整個列表提取出來,存成xml格式

 python,xslt,提取,網頁數(shù)據(jù),python提取網頁數(shù)據(jù),python提取數(shù)據(jù)

2.2、源代碼1:只抓當前頁,結果顯示在控制臺

Python的優(yōu)勢是用很少量代碼就能解決一個問題,請注意下面的代碼看起來很長,其實python函數(shù)調用沒有幾個,大篇幅被一個xslt腳本占去了,在這段代碼中,只是一個好長的字符串而已,至于為什么選擇xslt,而不是離散的xpath或者讓人撓頭的正則表達式,請參看《Python即時網絡爬蟲項目啟動說明》,我們期望通過這個架構,把程序員的時間節(jié)省下來一大半。
可以拷貝運行下面的代碼(在windows10, python3.2下測試通過):

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="//*[@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> <標題> <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> </標題> <回復數(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> </回復數(shù)> </item> </xsl:template>  <xsl:template match="//*[@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) 

源代碼請通過本文結尾的GitHub源下載。

2.3、抓取結果

得到的抓取結果如下圖:

 python,xslt,提取,網頁數(shù)據(jù),python提取網頁數(shù)據(jù),python提取數(shù)據(jù)

2.4、源代碼2:翻頁抓取,結果存入文件

我們對2.2的代碼再做進一步修改,增加翻頁抓取和存結果文件功能,代碼如下:

from urllib import request from lxml import etree import time  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="//*[@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> <標題> <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> </標題> <回復數(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> </回復數(shù)> </item> </xsl:template>  <xsl:template match="//*[@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>""")  baseurl = "http://www.gooseeker.com/cn/forum/7" basefilebegin = "jsk_bbs_" basefileend = ".xml" count = 1 while (count < 12):   url = baseurl + "?page=" + str(count)   conn = request.urlopen(url)   doc = etree.HTML(conn.read())   transform = etree.XSLT(xslt_root)   result_tree = transform(doc)   print(str(result_tree))   file_obj = open(basefilebegin+str(count)+basefileend,'w',encoding='UTF-8')   file_obj.write(str(result_tree))   file_obj.close()   count += 1   time.sleep(2) 

我們增加了寫文件的代碼,還增加了一個循環(huán),構造每個翻頁的網址,但是,如果翻頁過程中網址總是不變怎么辦?其實這就是動態(tài)網頁內容,下面會討論這個問題。

3、總結

這是開源Python通用爬蟲項目的驗證過程,在一個爬蟲框架里面,其它部分都容易做成通用的,就是網頁內容提取和轉換成結構化的操作難于通用,我們稱之為提取器。但是,借助GooSeeker可視化提取規(guī)則生成器MS謀數(shù)臺 ,提取器的生成過程將變得很便捷,而且可以標準化插入,從而實現(xiàn)通用爬蟲,在后續(xù)的文章中會專門講解MS謀數(shù)臺與Python配合的具體方法。

4、接下來閱讀

本文介紹的方法通常用來抓取靜態(tài)網頁內容,也就是所謂的html文檔中的內容,目前很多網站內容是用javascript動態(tài)生成的,一開始html是沒有這些內容的,通過后加載方式添加進來,那么就需要采用動態(tài)技術,請閱讀《Python爬蟲使用Selenium+PhantomJS抓取Ajax和動態(tài)HTML內容》

5、集搜客GooSeeker開源代碼下載源

1.GooSeeker開源Python網絡爬蟲GitHub源

6、文檔修改歷史

2016-05-26:V2.0,增補文字說明;把跟帖的代碼補充了進來

2016-05-29:V2.1,增加最后一章源代碼下載源

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 万州区| 云南省| 城口县| 夏邑县| 大姚县| 兴城市| 萝北县| 新泰市| 胶州市| 海宁市| 凤城市| 庆阳市| 高唐县| 白城市| 河南省| 崇阳县| 洛川县| 莫力| 兰坪| 洮南市| 二连浩特市| 太和县| 天祝| 赞皇县| 平谷区| 晋中市| 潞城市| 平定县| 天全县| 于都县| 凤阳县| 平遥县| 大邑县| 穆棱市| 泗水县| 长葛市| 兴业县| 广汉市| 濮阳市| 浑源县| 成都市|