2009-06-23 50 views
3

要求: 我有一個python項目,它以多種格式(Atom,有效的XML,無效的XML,csv,幾乎垃圾等等)解析多個數據源的數據提要並插入結果數據進入數據庫。捕獲是解析每個飼料所需的信息也必須存儲在數據庫中。模板驅動的訂閱解析

當前解決方案: 我以前的解決方案是存儲在原始數據上被評估的小python腳本,併爲解析的數據返回一個數據對象。我真的很想擺脫這種方法,因爲它顯然打開了一個令人討厭的安全漏洞。

理想的解決方案: 我在尋找的是我將描述爲python的模板驅動的feed解析器,這樣我就可以爲每個feed格式編寫一個模板文件,並且此模板文件將是用於理解各種數據格式。

我已經有限的成功發現,在過去這樣的事情,並希望有人可以有一個很好的建議。

謝謝大家!

回答

1

而不是eval ing腳本,也許你應該考慮做一個包呢? 解析CSV是一回事 - 格式簡單而規則,解析XML需要完全另一種方法。考慮到你不想從頭開始編寫每一個解析器,爲什麼不寫一堆小模塊,每個模塊都有相同的API並使用它們?我相信,使用Python本身(不是一些模板DSL)對於這類事情是理想的。

例如,這是我在一個small torrent-fetching script看到我使用的方法:

主程序:

... 
def import_plugin(name): 
    mod = __import__(name) 
    components = name.split('.') 
    for comp in components[1:]: 
     mod = getattr(mod, comp) 
    return mod 

... 
feed_parser = import_plugin('parsers.%s' % feed['format']) 
data = feed_parser(...) 
... 

parsers/csv.py

#!/usr/bin/python 
from __future__ import absolute_import 

import urllib2 
import csv 

def parse_feed(...): 
    ... 

如果你不」特別喜歡動態加載的模塊,你可以考慮編寫一個模塊,其中包含幾個解析類(可能來自某些「抽象語法分析器」)屁股)。

class BaseParser(object): 
    ... 

class CSVParser(BaseParser): 
    ... 
register_feed_parser(CSVParser, ['text/plain', 'text/csv']) 
... 

parsers = get_registered_feed_parsers(feed['mime_type']) 
data = None 
for parser in parsers: 
    try: 
     data = parser(feed['data']) 
     if data is not None: break 
    except ParsingError: 
     pass 
... 
+0

謝謝drdaeman,我真的很喜歡這個解決方案,並可能最終使用它。唯一不足的地方是解析腳本需要存儲在數據庫中。 的原因數據庫的要求是這個網站的管理員最好將能夠創建和管理這些解析腳本(有幾十人)在web界面,但即使管理員用戶信賴,其仍然不希望的,他們輸入的代碼最終得到評估。 我認爲這將歸結爲創建一個新的模塊或與您的建議。再次感謝! – 2009-06-23 17:05:33