2009-06-23 13 views
3

要件: 私は様々な形式(Atom、有効なXML、無効なXML、CSV、ほぼガベージなど)で複数のソースからのデータフィードを解析し、結果のデータを挿入するpythonプロジェクトを持っていますデータベースに格納する。キャッチは、各フィードを解析するために必要な情報で、データベースにも格納する必要があります。テンプレート駆動フィード解析

現在のソリューション: 私の以前の解決策は、生データにevalされた小さなpythonスクリプトを保存し、解析されたデータのデータオブジェクトを返すことでした。私は本当にこのメソッドから離れて、明らかに厄介なセキュリティホールを開くようにしたいと思います。

理想的な解答: 私が探しているのは、フィード形式ごとにテンプレートファイルを書くことができるように、Pythonのテンプレート駆動フィードパーサーとして説明するものです。このテンプレートファイルはさまざまなデータ形式を理解するために使用されます。

私は過去にこのようなことを見つけることに成功しておらず、誰かが良い提案をしてくれることを望んでいました。

ありがとうございました!

答えて

1

evalスクリプトの代わりに、それらのパッケージを作成することを検討する必要がありますか? CSVの解析は1つのことです。形式はシンプルで規則的ですが、XMLを解析するには全く別のアプローチが必要です。 1つのパーサーをすべてゼロから作成したくないということを考えれば、それぞれが同じAPIを使用している小さなモジュールを作成して使用するだけではいかがですか?私は、Python自体(いくつかのテンプレートDSLではない)を使用することは、この種のものには理想的だと思います。

主なプログラム:

... 
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(...): 
    ... 

あなたはドン場合」は、例えば

が、これは私が私が使用している1 small torrent-fetching scriptで見てきたアプローチであります特に動的にロードされるモジュールのように、いくつかのパースクラスを持つ単一のモジュール(おそらく、いくつかの "抽象パーサー"ベースclお尻)。

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インターフェイスに作成して管理することが理想的ですが、管理者は信頼できるユーザーでも、彼らはeval'edを得ることを終えるコードを入力します。 新しいモジュールを作成するか、あなたの提案に進むことになると思います。再度、感謝します! –

+0

ありがとうございます。エンドユーザーがコードにアクセスできるようにする必要がある場合は、間違っていてDSLやサンドボックスを作成して、信頼できるPythonモジュールと操作だけにアクセスできるようにしてください。残念ながら私はそういうものを開発していないので、アイデアはあまりありません。しかし、このリンクは役に立ちます:http://pypi.python.org/pypi/RestrictedPython/ – drdaeman

+0

もう一度あなたの助言に感謝します。私はRestrictedPythonのコンセプトの中でevalと一緒に行くつもりです。あるいは私が野心的と感じるなら、これを行うためのPythonモジュールの作成を試みるかもしれません。 –

関連する問題