2009-06-23 3 views
3

요구 사항 : 다양한 형식 (Atom, 유효한 XML, 유효하지 않은 XML, CSV, 거의 쓰레기 등)으로 여러 소스의 데이터 피드를 구문 분석하고 결과 데이터를 삽입하는 python 프로젝트가 있습니다. 데이터베이스로. 캐치는 각 피드를 구문 분석하는 데 필요한 정보도 데이터베이스에 저장해야합니다.템플릿 구동 피드 파싱

현재 해결 방법 : 이전 솔루션은 원시 데이터에 평가되는 작은 파이썬 스크립트를 저장하고 파싱 된 데이터에 대한 데이터 개체를 반환하는 것이 었습니다. 나는이 방법으로 벗어나고 싶다. 분명히 불쾌한 보안 구멍을 열게된다.

이상 해결책 : 제가 찾고있는 것은 제가 피드 형식에 대한 템플릿 파일을 작성할 수 있도록 파이썬 용 템플릿 기반 피드 파서로 설명 할 것이고이 템플릿 파일은 다양한 데이터 형식을 이해하는 데 사용됩니다.

저는 과거에 이와 같은 것을 찾는데 제한된 성공을 거두었으며 누군가가 좋은 제안을하기를 희망했습니다.

감사합니다.

답변

1

eval 스크립트 대신, 패키지를 만드는 것이 좋습니다. CSV 구문 분석은 형식이 단순하고 규칙적이어서 XML을 구문 분석하려면 완전히 다른 접근 방식이 필요합니다. 하나 하나의 파서를 처음부터 작성하는 것을 원하지 않는다면, 각각이 동일한 API를 사용하고 사용하는 작은 모듈을 작성하지 않는 이유는 무엇입니까? 필자는 파이썬 자체를 사용하여 (일부 템플릿 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(...): 
    ... 

당신이 돈이 '예를 들어

이 내가 사용하고 하나 small torrent-fetching script에서 본 적이 접근이다 특히 동적으로로드 된 모듈과 같이, 여러 파스 (parse) 클래스를 가진 하나의 모듈을 작성하는 것을 고려할 수 있습니다 (아마도 "추상 파서"기반 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, 정말 그 솔루션을 좋아하고 그것을 사용하여 끝낼 수 있습니다. 데이터베이스가 파싱 (parsing) 스크립트에 저장되어 있어야합니다. 데이터베이스 요구 사항의 이유는이 사이트의 관리자가 이상적으로 웹 인터페이스에 이러한 구문 분석 스크립트 (수십 개가 있음)를 만들고 관리 할 수 ​​있지만 관리자가 신뢰할 수있는 사용자 일지라도 그들은 eval'ed를 얻는 것을 끝내는 코드를 입력한다. 새로운 모듈을 만들거나 제안 사항을 따르는 것이 중요하다고 생각합니다. 다시 한 번 감사드립니다! –

+0

감사. 코드가 최종 사용자가 액세스 할 수 있어야한다면 DSL 또는 샌드 박스를 잘못 작성하여 신뢰할 수있는 파이썬 모듈 및 작업에만 액세스 할 수 있도록 허용하는 것이 좋습니다. 불행히도 저는 그런 것을 개발하지 않았기 때문에 아이디어가별로 없습니다. 어쩌면이 링크가 유용 할 것입니다. http://pypi.python.org/pypi/RestrictedPython/ – drdaeman

+0

다시 한번 귀하의 조언에 감사드립니다. RestrictedPython 개념 내에서 eval과 함께 끝낼 수도 있습니다. 또는 야심 차게 느끼는 경우이를 수행 할 파이썬 모듈을 만들 수도 있습니다. –