使用Pybtex将Bibtex转换为HTML,Python 3

4
我想将一个或多个bibtex条目的文件输出为HTML格式的字符串。具体的样式不是很重要,但我们可以说是APA风格。基本上,我想要bibtex2html的功能,但使用Python API,因为我正在使用Django。一些人提出了类似的问题herehere。我还找到了一个可能的解决方案here
我遇到的第一个问题非常基础,即我甚至无法运行上述解决方案。我一直收到类似于“ModuleNotFoundError:未找到名为'pybtex.database'的模块;'pybtex'不是包”的错误。我肯定已经安装了pybtex,并且可以在shell中轻松进行基本API调用,但每当我尝试导入pybtex.database.whatever或pybtex.plugin时,我都会收到“ModuleNotFound”错误。也许这是Python 2与Python 3的问题吗?我正在使用后者。
我的第二个问题是,我很难理解pybtex Python API documentation。具体来说,从我能看出来,似乎“format_from_string”和“format_from_file”调用是专门为我想要做的事情设计的,但我似乎无法获得正确的语法。具体而言,当我执行以下操作时:
pybtex.format_from_file('foo.bib',style='html')

我遇到了pybtex.plugin.PluginNotFound: plugin pybtex.style.formatting.html not found的错误。我认为我只是没有理解该调用应该如何工作,而且我找不到如何正确执行它的示例。
1个回答

2
这是我为类似用例编写的函数 - 将参考文献合并到由Pelican生成的网站中。最初的回答:

这里是我为类似用例编写的函数 - 将参考文献合并到由Pelican生成的网站中。

from pybtex.plugin import find_plugin
from pybtex.database import parse_string
APA = find_plugin('pybtex.style.formatting', 'apa')()
HTML = find_plugin('pybtex.backends', 'html')()

def bib2html(bibliography, exclude_fields=None):
    exclude_fields = exclude_fields or []
    if exclude_fields:
        bibliography = parse_string(bibliography.to_string('bibtex'), 'bibtex')
        for entry in bibliography.entries.values():
            for ef in exclude_fields:
                if ef in entry.fields.__dict__['_dict']:
                    del entry.fields.__dict__['_dict'][ef]
    formattedBib = APA.format_bibliography(bibliography)
    return "<br>".join(entry.text.render(HTML) for entry in formattedBib)

请确保您已安装以下内容:

最初的回答

pybtex==0.22.2
pybtex-apa-style==1.3

你的脚本运行得非常好。exclude_fields似乎需要一个列表变量 - 这确实非常方便,可以将“不需要”的键的列表提供给该函数。这是一种非常快速和有效的方法,可以控制参考文献输出到HTML的样式,而无需在某些情况下修改样式本身。 - jaggedjava
顺便提一下,在HTML中获取一个带编号的列表,以下方法至少对我有效。假设您的参考文献变量名为_data_。newdata = bib2html(data) newdata = newdata.replace("<br>","</li><li>") newdata = '<ol><li>' + newdata + '</li></ol>' - jaggedjava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接