亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python基礎(chǔ)教程項(xiàng)目三之萬(wàn)能的XML

 更新時(shí)間:2018年04月02日 11:03:43   作者:the5fire  
這篇文章主要為大家詳細(xì)介紹了python基礎(chǔ)教程項(xiàng)目三之萬(wàn)能的XML,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

這個(gè)項(xiàng)目的名稱與其叫做萬(wàn)能的XML不如叫做自動(dòng)構(gòu)建網(wǎng)站,根據(jù)一份XML文件,生成對(duì)應(yīng)目錄結(jié)構(gòu)的網(wǎng)站,不過(guò)只有html還是太過(guò)于簡(jiǎn)單了,如果要是可以連帶生成css那就比較強(qiáng)大了。這個(gè)有待后續(xù)研發(fā),先來(lái)研究下怎么html網(wǎng)站結(jié)構(gòu)。 既然是通過(guò)XML結(jié)構(gòu)生成網(wǎng)站,那所有的事情都應(yīng)該由這個(gè)XML文件來(lái)。先來(lái)看下這個(gè)XML文件,website.xml:

<website>
 <page name="index" title="Home page">
 <h1>Welcome to my Home page</h1>
 <p>Hi, there. My name is Mr.gumby,and this is my home page,here are some of my int:</p>
 <ul>
  <li><a href="interests/shouting.html" rel="external nofollow" >Shouting</a></li>
  <li><a href="interests/sleeping.html" rel="external nofollow" >Sleeping</a></li>
  <li><a href="interests/eating.html" rel="external nofollow" >Eating</a></li>
 </ul>
 </page>
 <directory name="interests">
  <page name="shouting" title="Shouting">
   <h1>shouting page</h1>
   <p>....</p>
  </page>
  <page name="sleeping" title="Sleeping">
   <h1>sleeping page</h1>
   <p>...</p>
  </page>
  <page name="eating" title="Eating">
    <h1>Eating page</h1>
    <p>....</p>
  </page>
 </directory>
</website>

有了這個(gè)文件,下面應(yīng)該來(lái)看怎么通過(guò)這個(gè)文件生成網(wǎng)站。

首先我們要解析這個(gè)xml文件,python解析xml和在java中一樣,有兩種方式,SAX和DOM,兩種處理方式不同點(diǎn)在于速度和范圍,前者講究的是效率,每次只處理文檔的一小部分,快速而能有效的利用內(nèi)存,后者是相反的處理方式,先把所有的文檔載入到內(nèi)存,然后再進(jìn)行處理,速度比較慢,也比較消耗內(nèi)存,唯一的好處就是可以操作整個(gè)文檔。

在python中使用sax方式處理xml要先引入xml.sax中的parse函數(shù),還有xml.sax.handler中的ContentHandler,后面的這個(gè)類是要和parse函數(shù)來(lái)配合使用的。使用方式如下: parse('xxx.xml',xxxHandler),這里面的xxxHandler要繼承上面的ContentHandler,不過(guò)只要繼承就行,不需要有所作為。 然后這個(gè)parse函數(shù)在處理xml文件的時(shí)候,會(huì)調(diào)用xxxHandler中的startElement函數(shù)和endElement函數(shù)來(lái)一個(gè)xml中的標(biāo)簽的開始和結(jié)束,中間的過(guò)程使用一個(gè)名為characters的函數(shù)來(lái)處理標(biāo)簽內(nèi)部的所有字符串。

有了上面的這些認(rèn)識(shí),我們已經(jīng)知道如何處理xml文件了,然后再來(lái)看那個(gè)罪惡的源頭website.xml文件,分析其結(jié)構(gòu),只有兩個(gè)節(jié)點(diǎn):page和directory,很明顯page表示一個(gè)頁(yè)面,directory表示一個(gè)目錄。

所以處理這個(gè)xml文件的思路就變的清晰了。讀取xml文件的每一個(gè)節(jié)點(diǎn),然后判斷是page還是directory如果是page則創(chuàng)建html頁(yè)面,然后把節(jié)點(diǎn)中的內(nèi)容寫到文件里。如果遇到directory就創(chuàng)建一個(gè)文件夾,然后再處理其內(nèi)部的page節(jié)點(diǎn)(如果存在的話)。
下面來(lái)看這部分代碼,書中的實(shí)現(xiàn)比較復(fù)雜,比較靈活。先來(lái)看,然后在分析。

from xml.sax.handler import ContentHandler
from xml.sax import parse
import os
class Dispatcher:
    def dispatch(self, prefix, name, attrs=None):
        mname = prefix + name.capitalize()
        dname = 'default' + prefix.capitalize()
        method = getattr(self, mname, None)
        if callable(method): args = ()
        else:
            method = getattr(self, dname, None)
            args = name,
        if prefix == 'start': args += attrs,
        if callable(method): method(*args)
    def startElement(self, name, attrs):
        self.dispatch('start', name, attrs)
    def endElement(self, name):
        self.dispatch('end', name)
class WebsiteConstructor(Dispatcher, ContentHandler):
    passthrough = False
    def __init__(self, directory):
        self.directory = [directory]
        self.ensureDirectory()
    def ensureDirectory(self):
        path = os.path.join(*self.directory)
        print path
        print '----'
        if not os.path.isdir(path): os.makedirs(path)
    def characters(self, chars):
        if self.passthrough: self.out.write(chars)
    def defaultStart(self, name, attrs):
        if self.passthrough:
            self.out.write('<' + name)
            for key, val in attrs.items():
                self.out.write(' %s="%s"' %(key, val))
            self.out.write('>')
    def defaultEnd(self, name):
        if self.passthrough:
            self.out.write('</%s>' % name)
    def startDirectory(self, attrs):
        self.directory.append(attrs['name'])
        self.ensureDirectory()
    def endDirectory(self):
        print 'endDirectory'
        self.directory.pop()
    def startPage(self, attrs):
        print 'startPage'
        filename = os.path.join(*self.directory + [attrs['name']+'.html'])
        self.out = open(filename, 'w')
        self.writeHeader(attrs['title'])
        self.passthrough = True
    def endPage(self):
        print 'endPage'
        self.passthrough = False
        self.writeFooter()
        self.out.close()
    def writeHeader(self, title):
        self.out.write('<html>\n <head>\n  <title>')
        self.out.write(title)
        self.out.write('</title>\n </head>\n <body>\n')
    def writeFooter(self):
        self.out.write('\n </body>\n</html>\n')
parse('website.xml',WebsiteConstructor('public_html'))

看起來(lái)這個(gè)程序上面分析的復(fù)雜了一些,不過(guò)偉人毛毛說(shuō)過(guò),任何復(fù)雜的程序都是紙老虎。那我們?cè)賮?lái)分析一下這個(gè)程序。

首先看到這個(gè)程序是有兩個(gè)類,其實(shí)完全可以當(dāng)作一個(gè)類,因?yàn)橛辛死^承。

然后再來(lái)看它多了些什么,除了我們分析出來(lái)的startElement和endElement以及characters,多出來(lái)了startPage,endPage;startDirectory,endDirectory;defaultStart,defaultEnd;ensureDirectory;writeHeader,writeFooter;和dispatch,這些個(gè)函數(shù)。除了dispatch,前面的函數(shù)都很好理解,每一對(duì)函數(shù)都是單純的處理對(duì)應(yīng)的html標(biāo)簽以及xml節(jié)點(diǎn)。而dispatch比較復(fù)雜,復(fù)雜之處在于他是用來(lái)動(dòng)態(tài)拼合函數(shù)并且進(jìn)行執(zhí)行的。

dispatch的處理思路是,首先根據(jù)傳遞的參數(shù)(就是操作名稱以及節(jié)點(diǎn)名稱)判斷是否存在對(duì)應(yīng)的函數(shù)如startPage,如果不存在則執(zhí)行default+操作名稱:如defaultStart。

一個(gè)函數(shù)一個(gè)函數(shù)搞清楚之后,就知道整個(gè)處理流程是什么樣了。首先創(chuàng)建一個(gè)public_html的文件,存放整個(gè)網(wǎng)站,然后讀xml的節(jié)點(diǎn),通過(guò)startElement和endElement調(diào)用dispatch進(jìn)行處理。然后就是dispatch怎么調(diào)用具體的處理函數(shù)了。 到此為止,這個(gè)項(xiàng)目算是分析完了。

主要掌握的內(nèi)容一個(gè)是python中使用SAX處理XML,另一個(gè)就是python中的函數(shù)的使用,比如getattr,傳參數(shù)時(shí)的星號(hào)……

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于python實(shí)現(xiàn)鼠標(biāo)實(shí)時(shí)坐標(biāo)監(jiān)測(cè)

    基于python實(shí)現(xiàn)鼠標(biāo)實(shí)時(shí)坐標(biāo)監(jiān)測(cè)

    這篇文章主要給大家介紹了如何基于python實(shí)現(xiàn)鼠標(biāo)實(shí)時(shí)坐標(biāo)監(jiān)測(cè),文章通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • python df遍歷的N種方式(小結(jié))

    python df遍歷的N種方式(小結(jié))

    本文主要介紹了python df遍歷的N種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • python神經(jīng)網(wǎng)絡(luò)Densenet模型復(fù)現(xiàn)詳解

    python神經(jīng)網(wǎng)絡(luò)Densenet模型復(fù)現(xiàn)詳解

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Densenet模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python將文本去空格并保存到txt文件中的實(shí)例

    Python將文本去空格并保存到txt文件中的實(shí)例

    今天小編就為大家分享一篇Python將文本去空格并保存到txt文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python中schedule模塊關(guān)于定時(shí)任務(wù)使用方法

    Python中schedule模塊關(guān)于定時(shí)任務(wù)使用方法

    這篇文章主要介紹了Python中schedule模塊關(guān)于定時(shí)任務(wù)使用方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • pybind11在Windows下的使用教程

    pybind11在Windows下的使用教程

    Pybind11算是目前最方便的Python調(diào)用C++的工具了, 介紹一下在vs2019上寫Python的擴(kuò)展的HelloWorld,感興趣的朋友跟隨小編一起看看吧
    2019-07-07
  • Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法

    Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法

    今天小編就為大家分享一篇Ubuntu下使用python讀取doc和docx文檔的內(nèi)容方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • python excel轉(zhuǎn)換csv代碼實(shí)例

    python excel轉(zhuǎn)換csv代碼實(shí)例

    這篇文章主要介紹了python excel轉(zhuǎn)換csv代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python爬蟲入門案例之爬取去哪兒旅游景點(diǎn)攻略以及可視化分析

    Python爬蟲入門案例之爬取去哪兒旅游景點(diǎn)攻略以及可視化分析

    讀萬(wàn)卷書不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶你爬取去哪兒平臺(tái)的旅游景點(diǎn)攻略并進(jìn)行可視化分析,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣
    2021-10-10
  • Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面)

    Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面)

    本文主要介紹了Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論