欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年02月23日 14:35:21   作者:fullerhua  
這篇文章主要為大家詳細介紹了Python使用xslt提取網(wǎng)頁數(shù)據(jù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

1、引言

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

2、用lxml庫實現(xiàn)網(wǎng)頁內(nèi)容提取

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

這2天測試了在python中通過xslt來提取網(wǎng)頁內(nèi)容,記錄如下:

2.1、抓取目標

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

 

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

Python的優(yōu)勢是用很少量代碼就能解決一個問題,請注意下面的代碼看起來很長,其實python函數(shù)調(diào)用沒有幾個,大篇幅被一個xslt腳本占去了,在這段代碼中,只是一個好長的字符串而已,至于為什么選擇xslt,而不是離散的xpath或者讓人撓頭的正則表達式,請參看《Python即時網(wǎng)絡(luò)爬蟲項目啟動說明》,我們期望通過這個架構(gòu),把程序員的時間節(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="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> 
</標題> 
<回復(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) 

源代碼請通過本文結(jié)尾的GitHub源下載。

2.3、抓取結(jié)果

得到的抓取結(jié)果如下圖:

 

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

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

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="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> 
</標題> 
<回復(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>""") 
 
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),構(gòu)造每個翻頁的網(wǎng)址,但是,如果翻頁過程中網(wǎng)址總是不變怎么辦?其實這就是動態(tài)網(wǎng)頁內(nèi)容,下面會討論這個問題。

3、總結(jié)

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

4、接下來閱讀

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

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

1.GooSeeker開源Python網(wǎng)絡(luò)爬蟲GitHub源

6、文檔修改歷史

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

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python-Web框架flask使用示例教程

    Python-Web框架flask使用示例教程

    這篇文章主要介紹了Python-Web框架flask使用示例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • 詳解python的集合set的函數(shù)

    詳解python的集合set的函數(shù)

    這篇文章主要為大家介紹了python的集合set的函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python日期和時間戳的轉(zhuǎn)換的實現(xiàn)方式

    Python日期和時間戳的轉(zhuǎn)換的實現(xiàn)方式

    Python中日期和時間的處理涉及到time和datetime模塊,time模塊可實現(xiàn)時間戳與格式化時間字符串的轉(zhuǎn)換,而datetime模塊則提供更加直接易用的接口,本文詳細給大家介紹了Python日期和時間戳的轉(zhuǎn)換的實現(xiàn)方式,需要的朋友可以參考下
    2024-10-10
  • Python數(shù)據(jù)分析與處理(二)——處理中國地區(qū)信息

    Python數(shù)據(jù)分析與處理(二)——處理中國地區(qū)信息

    這篇文章主要介紹了Python數(shù)據(jù)分析與處理-處理中國地區(qū)信息,上文介紹了北京高考分數(shù)線統(tǒng)計分析,這篇文章依然圍繞Python數(shù)據(jù)分析與處理的相關(guān)資料來介紹處理中國地區(qū)信息,需要的朋友可以參考一下
    2021-12-12
  • python+selenium實現(xiàn)163郵箱自動登陸的方法

    python+selenium實現(xiàn)163郵箱自動登陸的方法

    本篇文章主要介紹了python+selenium實現(xiàn)163郵箱自動登陸的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Python?tkinter庫圖形繪制例子分享

    Python?tkinter庫圖形繪制例子分享

    這篇文章主要介紹了?Python?tkinter庫圖形繪制例子,文章基于Python的相關(guān)資料展開主題,分享繪圖小例子,需要的小伙伴可以參考一下
    2022-04-04
  • python中threading和queue庫實現(xiàn)多線程編程

    python中threading和queue庫實現(xiàn)多線程編程

    這篇文章主要介紹了python中threading和queue庫實現(xiàn)多線程編程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Python?Celery定時任務(wù)詳細講解

    Python?Celery定時任務(wù)詳細講解

    這篇文章主要介紹了Python?Celery定時任務(wù)詳細講解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • python列出目錄下指定文件與子目錄的方法

    python列出目錄下指定文件與子目錄的方法

    這篇文章主要介紹了python列出目錄下指定文件與子目錄的方法,涉及Python使用os模塊與glob操作目錄與文件的技巧,需要的朋友可以參考下
    2015-07-07
  • python驗證碼識別教程之利用滴水算法分割圖片

    python驗證碼識別教程之利用滴水算法分割圖片

    這篇文章主要給大家介紹了關(guān)于python驗證碼識別教程之利用滴水算法分割圖片的相關(guān)資料,文章中通過示例代碼介紹的非常詳細,對大家的學習或者具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06

最新評論