,引言
在Python網絡爬蟲內容提取器一文我們詳細講解了核心部件:可插拔的內容提取器類gsExtractor。本文記錄了確定gsExtractor的技術路線過程中所做的編程實驗。這是第一部分,實驗了用xslt方式一次性提取靜態網頁內容并轉換成xml格式。
2,用lxml庫實現網頁內容提取
lxml是python的一個庫,可以迅速、靈活地處理 XML。它支持 XML Path Language (XPath) 和 Extensible Stylesheet Language Transformation (XSLT),并且實現了常見的 ElementTree API。
這2天測試了在python中通過xslt來提取網頁內容,記錄如下:
2.1,抓取目標
假設要提取集搜客官網舊版論壇的帖子標題和回復數,如下圖,要把整個列表提取出來,存成xml格式
2.2,源代碼1:只抓當前頁,結果顯示在控制臺
Python的優勢是用很少量代碼就能解決一個問題,請注意下面的代碼看起來很長,其實python函數調用沒有幾個,大篇幅被一個xslt腳本占去了,在這段代碼中,只是一個好長的字符串而已,至于為什么選擇xslt,而不是離散的xpath或者讓人撓頭的正則表達式,請參看《Python即時網絡爬蟲項目啟動說明》,我們期望通過這個架構,把程序員的時間節省下來一大半。
可以拷貝運行下面的代碼(在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="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> <標題> <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> </標題> <回復數> <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> </回復數> </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)
2.3,抓取結果
得到的抓取結果如下圖:
2.4,源代碼2:翻頁抓取,結果存入文件
我們對2.2的代碼再做進一步修改,增加翻頁抓取和存結果文件功能,代碼如下:
from urllib import request from lxml import etree import timexslt_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> <標題> <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> </標題> <回復數> <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> </回復數> </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>""") baseurl = "http://www.gooseeker.com/cn/forum/7"basefilebegin = "jsk_bbs_"basefileend = ".xml"count = 1while (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)
我們增加了寫文件的代碼,還增加了一個循環,構造每個翻頁的網址,但是,如果翻頁過程中網址總是不變怎么辦?其實這就是動態網頁內容,下面會討論這個問題。
3,總結
這是開源Python通用爬蟲項目的驗證過程,在一個爬蟲框架里面,其它部分都容易做成通用的,就是網頁內容提取和轉換成結構化的操作難于通用,我們稱之為提取器。但是,借助GooSeeker可視化提取規則生成器MS謀數臺 ,提取器的生成過程將變得很便捷,而且可以標準化插入,從而實現通用爬蟲,在后續的文章中會專門講解MS謀數臺與Python配合的具體方法。
好了,以上就是小編給大家帶來的全部內容,轉發此文+關注 并私信小編“資料”即可免費領取2019最新python資料和零基礎入門教程,不定期分享干貨,歡迎初學和進階中的小伙伴!
人高等教育在讀本科生注意了,申請學位 別忘報考外語省統考。
河南省教育廳消息,2017年河南省成人學士學位外語統考將于2月20日啟動報名。各類成人高等教育在讀本科生,擬申請獲得學士學位者,都須參加此項考試。
統考定于4月23日
河南省成人學士學位外語統考全稱為河南省成人高等教育本科畢業生申請學士學位外國語水平統一考試,今年的統考定于4月23日(星期日)上午9時至11時進行。報名采取網上報名與現場確認相結合的方式進行,網上報名時間為2月20日~3月10日,報名網址為http://www.chinadegrees.cn/xsxw/index.html。網上繳費成功且照片審核通過的考生須本人攜帶第二代居民身份證原件、《報名登記表(樣表)》,在高校報考點指定時間內,到規定地點進行現場確認。現場確認工作將于3月17日前完成,報名信息經考生本人簽字確認后,一律不得更改。只完成網上報名但未在規定時間內辦理現場確認手續的,本次報名無效。
所有語種均不考聽力
按照規定,各類成人高等教育在讀本科生,擬申請獲得學士學位者,都須參加此項考試。考生可報考語種為英語、日語、俄語,所有語種均不考聽力。其中,外語類專業的考生應試語種為其所學專業教學計劃規定的第二外國語語種。
目前河南省開展成人學士學位授予工作的高校共有40所,考生可通過報名平臺查詢。所有考生應在規定報名點報名參加考試,否則考試成績無效。考生在5月中旬可通過河南省學位委員會辦公室官方網站(http://xwb.haedu.gov.cn/)查詢成績。考試合格名單將在5月底寄發有關學位授予單位。
“借考生”
在河工大現場確認
省教育廳提醒,在河南省借考的省外高校考生需經其高校所在地省級學位主管部門和省教育廳學位管理與研究生教育處同意后方可報名參加考試。在河南省借考的省外高校考生,只能選擇在河南工業大學考點進行現場確認。
據悉,各類成人高等教育本科生自取得學籍(高等教育自學考試考生自參加全國高等教育自學考試開始)即可報名參加學位外語考試,考試合格成績自下發之日起四年內有效。一次有效的成人學位外語統考合格成績只能用于向考生所在學位授予單位申請獲得一個成人學士學位。高等教育自學考試本科生可在獲得本科畢業證書后一年內申請獲得學士學位,除高等教育自學考試本科生以外的其他各類成人高等教育本科生在獲得本科畢業證書后不得再申請學士學位。(鄭報融媒記者 張競昳)
SLT 是一種用于將 XML 文檔轉換為 XHTML 文檔或其他 XML 文檔的語言。
XPath 是一種用于在 XML 文檔中進行導航的語言。
您需要具備的基礎知識
在您繼續學習之前,需要對以下知識有基本的了解:
HTML / XHTML
XML / XML 命名空間
XPath
如果您想要首先學習這些項目,請在我們的首頁訪問這些教程。
什么是 XSLT?
XSLT 指 XSL 轉換(XSL Transformations)
XSLT 是 XSL 中最重要的部分
XSLT 可將一種 XML 文檔轉換為另外一種 XML 文檔
XSLT 使用 XPath 在 XML 文檔中進行導航
XSLT 是一個 W3C 標準
XSLT = XSL 轉換
XSLT 是 XSL 中最重要的部分。
XSLT 用于將一種 XML 文檔轉換為另外一種 XML 文檔,或者可被瀏覽器識別的其他類型的文檔,比如 HTML 和 XHTML。通常,XSLT 是通過把每個 XML 元素轉換為 (X)HTML 元素來完成這項工作的。
通過 XSLT,您可以向輸出文件添加元素和屬性,或從輸出文件移除元素和屬性。您也可重新排列并分類元素,執行測試并決定隱藏或顯示哪個元素,等等。
描述轉化過程的一種通常的說法是,XSLT 把 XML 源樹轉換為 XML 結果樹。
XSLT 使用 XPath
XSLT 使用 XPath 在 XML 文檔中查找信息。XPath 被用來通過元素和屬性在 XML 文檔中進行導航。
如果您想要首先學習 XPath,請訪問我們的 XPath 教程。
它如何工作?
在轉換過程中,XSLT 使用 XPath 來定義源文檔中可匹配一個或多個預定義模板的部分。一旦匹配被找到,XSLT 就會把源文檔的匹配部分轉換為結果文檔。
XSLT 是一個 W3C 標準
XSLT 在 1999 年 11 月 16 日被確立為 W3C 標準。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。