CMSimple Drupal Yii 內容管理系統三方案 - 提升台灣中小企業競爭力

目前位置:   首頁 > CMS Projects > 美麗煲的湯

美麗煲的湯

假如您曾經聽過"愛情釀的酒"就不應該懷疑是否存在"美麗煲的湯":-)

在 Python 的領域中, 許多人都嚐過"美麗煲的湯", 也就是所謂的 BeatifulSoup. 這碗湯頭目前還未能完全 Python 3 相容, 但是只要 2to3.py 一番就可以開始用 Python 3 裝碗嚐用.

第一口::

#coding= utf-8
from bs4 import BeautifulSoup
html = '''
<html>
<head>Heading</head>
<body attr1='val1'>
    <div class='container'>
        <div id='class'>這裡有內容</div>
        <div>這裡也有內容</div>
    </div>
</body>
</html>
'''
parsed_html = BeautifulSoup(html)
print(parsed_html.body.find('div', attrs={'class':'container'}).text)

 再一口:

#coding: utf-8
 
from bs4 import BeautifulSoup
 
# 以 utf-8 編碼開啟 input.html
doc = BeautifulSoup(open('input.html', encoding="utf-8"))
 
# 建立空數列
entries = []
 
# 利用 find_all 找到所有的 h1 標註
for section in doc.find_all('h1'):
 
  # 取得 h1 的 header
  header = section.find_all(text=True)[0].split('.')
 
  # 取得隨後的內文
  content = ""
 
  # Find next tag
  for p in section.find_next_siblings():
 
    # 擷取 h1 所屬內容, 直到下一個 h1 標註
    if p.name == 'h1':
      break
 
    # 這裡在清除所屬內容
    # 移除 'span' 標註
    if p.span:
      p.span.unwrap()
    # 刪除內文類別
    del p['class']
 
    # 處理跳行字元
    content +=p.text.replace("n", ' ')
 
    # 跳行採用 break 標註
    content += '<br/>'
 
  # 將廻圈所找到的 header 與 content 放在一起
  entries.append({ 'header': header, 'content': content})
 
# 印出結果
print(entries)
''' input.html 檔案內容
<h1>Header 1</h1>
<p>標題一的內容
with lots of text inside it
</p>
<p>Paragraph 2
with some more text
</p>
<h1>Header 2</h1>
<p>標題二的內容
with lots of text inside it
</p>
<p>Paragraph 2
with some more text
</p>
'''

也就是說, 利用"美麗煲的湯"可以輾轉利用 Python 3 編寫與 CMSimple 類似的網際內容管理系統.

基本流程如下:

1. 利用 CherryPy 網際框架建立所需的網際程式主體.

2. 結合 CherryPy 與 ckeditor Javascript, 讓使用者利用瀏覽器表單管理 content.html 內容.

3. 透過"美麗煲的湯"抓取各標題所屬的頁面內容.

4. 利用 Mako 統一格式的 template, 將 content.html  解讀後的各頁面內容顯示在網站上.

5. 提供 login 模式, 可讓使用者通過驗證, 成為管理者, 負責進行內容管理.

6. 設法在 Python 與 BeautifulSoup 架構下提供延伸程式環境.

Python 3 相容的 bs4.7z

此外, 假如要將 Python 數列轉為 html 的 unordered list, 可以使用下列程式碼:

def SequenceToUnorderedList(seq, i=1):
    html_code = "&nbsp;"*(i-1)+"<ul>\n"
    for item in seq:
        if type(item) == type([]):
            html_code += SequenceToUnorderedList(item, i+1)
        else:
            html_code += "&nbsp;"*i+"<li>%s</li>\n" % item
    html_code += "&nbsp;"*(i-1)+"</ul>\n"
    return html_code
'''
def SequenceToUnorderedList(seq,i=1):
    tab = '\t'
    html_code = "%s\n" % (tab*(i-1))
    for item in seq:
        if type(item) == type([]):
            html_code += SequenceToUnorderedList(item, i+1)
        else:
            html_code += "%s%s\n" % (tab*i, item)
    html_code += "%s\n" % (tab*(i-1))
    return html_code
'''
seq = [1, 2, 3, [1,2,3], 4, 5, 6]
print(SequenceToUnorderedList(seq))

 與 CherryPy 結合:

import cherrypy
import os
from bs4 import BeautifulSoup
def cmsimply(filename):
    # 以 utf-8 編碼開啟 input.html
    #doc = BeautifulSoup(open('input.html', encoding="utf-8"))
    doc = BeautifulSoup(open(filename, encoding="utf-8"))
    # 建立空數列
    entries = []
    # 利用 find_all 找到所有的 h1 標註
    for section in doc.find_all('h1'):
        # 取得 h1 的 header
        header = section.find_all(text=True)[0].split('.')[0]
        # 取得隨後的內文
        content = ""
        # Find next tag
        for p in section.find_next_siblings():
            # 擷取 h1 所屬內容, 直到下一個 h1 標註
            if p.name == 'h1':
                break
            # 這裡在清除所屬內容
            # 移除 'span' 標註
            '''
            if p.span:
                p.span.unwrap()
            # 刪除內文類別
            del p['class']
            
            # 處理跳行字元
            content +=p.text.replace("n", ' ')
            # 跳行採用 break 標註
            content += '<br/>'
            '''
            content += str(p)
        # 將廻圈所找到的 header 與 content 放在一起
        entries.append({ 'header': header, 'content': content})
    return entries
    
class Brython(object):
    @cherrypy.expose
    def index(self):
        資料 = ""
        content = cmsimply("input.html")
        for 頁面數 in range(len(content)):
            pagedic = content[頁面數]
            資料 += "標題:"+pagedic["header"]+"<br />"
            資料 += "內容:"+pagedic["content"]+"<br />"
            資料 += "<hr>"
        return 資料
# 確定程式檔案所在目錄
_curdir = os.path.join(os.getcwd(), os.path.dirname(__file__))
# 配合程式檔案所在目錄設定靜態目錄或靜態檔案
application_conf = {'/jscript':{
        'tools.staticdir.on': True,
        'tools.staticdir.dir': _curdir+"/jscript"}
    }
cherrypy.quickstart(Brython(), config = application_conf)
'''
input.html 檔案內容
<h1>Header 1</h1>
<p>標題一的內容
with lots of text inside it
</p>
<p>Paragraph 2
with some more text
</p>
<h1>Header 2</h1>
<p>標題二的內容<br /><br />
再增加一些內容
<a href="http://www.google.com">google</a>
with lots of text inside it
</p>
<p>Paragraph 2
with some more text
</p>
'''

 再增加編輯功能:

import cherrypy
import os
from bs4 import BeautifulSoup
def cmsimply(filename):
    # 以 utf-8 編碼開啟 input.html
    #doc = BeautifulSoup(open('input.html', encoding="utf-8"))
    doc = BeautifulSoup(open(filename, encoding="utf-8"))
    # 建立空數列
    entries = []
    # 利用 find_all 找到所有的 h1 標註
    for section in doc.find_all('h1'):
        # 取得 h1 的 header
        header = section.find_all(text=True)[0].split('.')[0]
        # 取得隨後的內文
        content = ""
        # Find next tag
        for p in section.find_next_siblings():
            # 擷取 h1 所屬內容, 直到下一個 h1 標註
            if p.name == 'h1':
                break
            # 這裡在清除所屬內容
            # 移除 'span' 標註
            '''
            if p.span:
                p.span.unwrap()
            # 刪除內文類別
            del p['class']
             
            # 處理跳行字元
            content +=p.text.replace("n", ' ')
            # 跳行採用 break 標註
            content += '<br/>'
            '''
            content += str(p)
        # 將廻圈所找到的 header 與 content 放在一起
        entries.append({ 'header': header, 'content': content})
    return entries
def file_get_contents(filename):
    with open(filename, encoding="utf-8") as f:
        return f.read()
         
class Brython(object):
    @cherrypy.expose
    def index(self):
        資料 = ""
        content = cmsimply("input.html")
        for 頁面數 in range(len(content)):
            pagedic = content[頁面數]
            資料 += "標題:"+pagedic["header"]+"<br />"
            資料 += "內容:"+pagedic["content"]+"<br />"
            資料 += "<hr>"
        資料 += "<a href='/edit'>編輯</a>"
        return 資料
    @cherrypy.expose
    def edit(self):
        資料 = file_get_contents("input.html")
        outstring = "<form method=post action=doSave>"
        outstring += "<textarea name=mydata cols=50 rows=10>"+資料+"</textarea>"
        outstring += "<br /><input type=submit value=send>"
        outstring += "</form>"
        return outstring
    @cherrypy.expose
    def doSave(self, mydata):
        檔案 = open("input.html", "w", encoding="utf-8")
        檔案.write(mydata.rstrip('\n'))
        檔案.close()
        return "已經存檔<br /><a href='/'>回首頁</a>"
# 確定程式檔案所在目錄
_curdir = os.path.join(os.getcwd(), os.path.dirname(__file__))
# 配合程式檔案所在目錄設定靜態目錄或靜態檔案
application_conf = {'/jscript':{
        'tools.staticdir.on': True,
        'tools.staticdir.dir': _curdir+"/jscript"}
    }
cherrypy.quickstart(Brython(), config = application_conf)
'''
input.html 檔案內容
<h1>Header 1</h1>
<p>標題一的內容
with lots of text inside it
</p>
<p>Paragraph 2
with some more text
</p>
<h1>Header 2</h1>
<p>標題二的內容<br /><br />
再增加一些內容
<a href="http://www.google.com">google</a>
with lots of text inside it
</p>
<p>Paragraph 2
with some more text
</p>
'''

Powered by CMSimple_XH| Template: ge-webdesign.de| 登入