2013-10-10 2 views
2

Я создаю базу данных публикаций, которая позволяет пользователям вводить записи bibtex, которые затем обрабатываю и сохраняю в db. Прямо сейчас у меня возникли проблемы с анализом записей бибтекса. Я пытаюсь использовать pybtex для разбора. Во-первых, я не вижу, что pybtex имеет параметр parse (input) только параметр parse_file(). Это то, что я делаю в данный момент:Pybtex не recogonize запись bibtex

def convert_to_modelform(bibtexb): 
    parser = bibtex.Parser() 
    f = open('/tmp/bibtex.bib', 'w') 
    f.write(bibtexb) 
    f.close 
    bibdata = parser.parse_file('/tmp/bibtex.bib') 
    print bibdata 
    print len(bibdata.entries) 
    return bibtexb 

/tmp/bibtex.bib имеет содержание:

@article{article, 
    author = {Peter Adams}, 
    title = {The title of the work}, 
    journal = {The name of the journal}, 
    year = 1993, 
    number = 2, 
    pages = {201-213}, 
    month = 7, 
    note = {An optional note}, 
    volume = 4 
} 

печати bibdata и печати LEN (bibdata.entries) дают мне:

BibliographyData(entries=OrderedCaseInsensitiveDict({}), preamble=[]) 
0 

Что мне здесь не хватает?

ответ

1

Для разбора из строки, используйте StringIO в сочетании с parse_stream:

import pybtex.database.input.bibtex 
from StringIO import StringIO 

def bibtex_string_to_data(s): 
    parser = pybtex.database.input.bibtex.Parser() 
    return parser.parse_stream(StringIO(s)) 

print bibtex_string_to_data(""" 
@article{article, 
    author = {Peter Adams}, 
    title = {The title of the work}, 
    journal = {The name of the journal}, 
    year = 1993, 
    number = 2, 
    pages = {201-213}, 
    month = 7, 
    note = {An optional note}, 
    volume = 4 
} 
""") 

, который дает (переформатировать для удобства чтения):

BibliographyData(entries=OrderedCaseInsensitiveDict({ 
    'article': Entry(
     'article', 
     fields={ 
      'volume': '4', 
      'title': 'The title of the work', 
      'journal': 'The name of the journal', 
      'number': '2', 
      'month': '7', 
      'note': 'An optional note', 
      'year': '1993', 
      'pages': '201-213'}, 
     persons={ 
      'author': [Person(u'Adams, Peter')]}) 
    }), preamble=[]) 
Смежные вопросы