Skip to main content

ISBN(国际标准书号)的提取、清理、转换、连字符和元数据。

项目描述

建成状态 错误 PYPI 下载

信息

isbnlib是一个(纯)python 库,它提供了几种有用的方法和函数来验证、清理、转换、断字和获取 ISBN 字符串的元数据。

国际标准书号

ISBN 的正式形式类似于ISBN 979-10-90636-07-1。然而,对于大多数应用程序来说,只有数字很重要,如果需要,您可以随时“屏蔽”它们(见下文)。该库主要使用“条纹”ISBN(仅数字和 X),例如“0826497527”。您可以使用canonical(isbnlike)剥离类似 ISBN 的字符串。您可以使用mask(isbn)来“屏蔽” ISBN 。所以在下面的例子中,当你在参数中看到'isbn'时,它是一个'striped' ISBN,当参数是'isbnlike'时,它是一个字符串,如ISBN 979-10-90636-07-1甚至是什么像asdf 979-10-90636-07-1 bla bla一样脏。

两个重要的概念:有效的 ISBN 应该是根据规则构建的 ISBN,这与已发布的 ISBN 不同,后者是已经发布给出版商的 ISBN(这是图书馆和大多数 Web 服务的使用) . 然而isbn.org可能出于法律原因,将两者合并!因此,根据isbn-international.org,'9786610326266' 无效(因为块 978-66... 尚未发布,但是如果你使用is_isbn13('9786610326266')你会得到True (因为 '9786610326266' 如下ISBN 的规则)。但是情况更加模糊,试试meta('9786610326266')你会发现这个 ISBN 已经被使用了!

如果可能,请使用 isbn-13 格式的 ISBN(自 2007 年以来,仅发布 isbn-13 格式的 ISBN)。您始终可以将 isbn-10 转换为 isbn-13,但不能反过来(阅读内容)。在isbn-international.orgwikipedia上阅读有关 ISBN 的更多信息。

主要功能

is_isbn10(isbn10like)

验证为 ISBN-10。

is_isbn13(isbn13like)

验证为 ISBN-13。

to_isbn10(isbn13)

将 isbn-13 转换为 isbn-10。

to_isbn13(isbn10)

将 isbn-10 转换为 isbn-13。

规范(isbnlike)

只保留数字和 X。你会得到像9780321534965954430603X这样的字符串。

干净(isbnlike)

清除 ISBN(仅限合法字符)。

notisbn(isbnlike,级别='严格')

检查目标以使 isbn-like 无效。

get_isbnlike(文本,级别='正常')

提取所有看起来像 ISBN 的子字符串(对于抓取非常有用)。

get_canonical_isbn(isbnlike,输出='bouth')

提取 ISBN 并将其转换为规范形式。

ean13(isbnlike)

isbnlike字符串转换为 EAN13 数字(经过验证的规范 ISBN-13)。

信息(isbn)

获取分配给此 ISBN 的语言或国家/地区。

掩码(isbn,分隔符='-')

屏蔽(连字符)规范的 ISBN。

元(isbn,服务='默认')

为您提供与 ISBN 关联的主要元数据。作为服务参数,您可以使用: “goob”使用Google 图书服务不需要密钥)并且 是默认选项“wiki”使用wikipedia.org api(不需要密钥), “openl”使用OpenLibrary。 org api(不需要密钥)。您可以使用config.add_apikey(service, apikey)输入 API 密钥(参见下面的示例)。输出可以格式化为bibtex , csl (CSL-JSON), msword , endnoterefworksopfjson (BibJSON) 书目格式与registry.bibformatters现在,您可以通过添加插件、更多元数据提供程序或新的书目格式化程序(检查可用插件)来扩展此功能的功能。

版本(isbn,服务='合并')

返回与此 ISBN 相关的版本的 ISBN 列表。默认使用“合并”(合并“openl”、“thingl”和“wiki”),但其他提供程序可用:“openl”(使用Open Library中的搜索 API )、“thingl”(使用LibraryThing中的服务 ThingISBN )、'wiki'(使用来自Wikipedia的服务引用)和'any'(首先尝试'wiki',如果没有数据则'openl')。

isbn_from_words(单词)

从单词列表中返回最可能的 ISBN(针对您的地理区域)。

goom(词)

Google Books multiple references返回参考列表。

分类(isbn)

返回规范 ISBN的分类器字典。有关这些分类器的含义,请参阅OCLC。底层服务中的大部分数据都是针对英文书籍的。

doi(isbn)

从 ISBN-13 返回 DOI 的 ISBN-A。

doi2tex(DOI)

返回给定 DOI 格式为 BibTeX 的元数据。

任(文件名)

使用文件名中 ISBN 中的元数据重命名文件。

描述(isbn)

返回图书的简短描述。 几乎所有可用的数据都是针对美国书籍的!

封面(isbn)

返回带有封面 url 的字典。 几乎所有可用的数据都是针对美国书籍的!

请参阅文件test_coretest_ext以获取大量示例

安装

从命令行输入(在某些情况下,您必须在命令前加上sudo):

$ pip install isbnlib

如果您使用 linux 系统,您可以使用您的分发包管理器进行安装(所有主要发行版都有包python-isbnlibpython3-isbnlib),但是(通常)非常旧并且不再工作了

对于开发人员

API 的主要命名空间

在命名空间isbnlib 中,您可以访问核心函数is_isbn10is_isbn13to_isbn10to_isbn13canonicalcleannotisbnget_isbnlikeget_canonical_isbnmaskinfocheck_digit10check_digit13doiean13

此外,您还可以访问元数据函数,即: metaeditionsrendesccovergoomclassifydoi2texisbn_from_words

这些方法引发的异常都可以使用ISBNLibException捕获。

您可以使用命名空间isbnlib.dev中公开的类和函数来扩展 lib ,即:

  • WEBService一个处理对 Web 服务的访问(仅通过传递 url)并支持gzip的类。您可以将其子类化以扩展功能……但您可能不需要使用它!它在下一堂课中使用。

  • WEBQuery一个使用WEBService从 Web 服务检索和解析数据的类。您可以通过子类化此类来构建新的元数据提供者。他的主要方法允许传递专门针对特定需求(data_checkerparser )的自定义函数(处理程序)。它实现了一种节流机制,默认速率为每个服务每秒一次调用。

  • 元数据一个构造、清理和“验证”元数据记录的类。他的方法merge允许为来自不同来源的记录实现一个简单的合并过程。这个类的主要特性,可以通过调用stdmeta函数来实现!

  • vias公开了几个函数来调用服务,只需将名称和指针传递给服务的查询函数。 vias.parallel允许进行线程调用。您可以使用vias.serial进行串行调用,并 使用vias.multi使用多个内核。默认为vias.serial

这些方法引发的异常都可以使用ISBNLibDevException捕获。你不应该在你的代码中引发这个异常,只引发在isbnlib.dev中暴露的特定异常,其名称以 Error 结尾。

isbnlib.dev.helpers中,您可以找到几种我们发现非常有用的方法,其中一些仅用于isbntools(使用isbnlib的应用程序和框架)。

使用isbnlib.config,您可以读取和设置配置选项:使用seturlopentimeoutsetthreadstimeout更改超时,使用 apikeys访问 api 密钥并使用add_apikey添加新密钥,使用options.get('OPTION1')访问和设置通用和用户定义的选项和设置选项

最后,从isbnlib.registry您可以更改默认使用的元数据服务(setdefaultservice),添加新服务(add_service),访问元数据的书目格式化程序(bibformatters),设置默认格式化程序(setdefaultbibformatter),添加新格式化程序(add_bibformatter)并设置一个新的缓存(set_cache)(例如关闭缓存set_cache(None))。缓存仅适用于通过元数据函数调用。这些更改仅适用于“当前会话”,因此应始终在调用其他方法之前完成。

让我们用一个小例子来具体化这些观点。

假设您想要一个小脚本来使用BibTeX 格式的Open Library获取元数据。

一个最小的脚本是:

from isbnlib import meta
from isbnlib.registry import bibformatters

SERVICE = "openl"

# now you can use the service
isbn = "9780446310789"
bibtex = bibformatters["bibtex"]
print(bibtex(meta(isbn, SERVICE)))

插件

您可以通过添加插件来扩展库的功能(目前,只是新的元数据提供者或新的书目格式化程序)。

有关可用插件,请在此处查看

安装后,您的插件将透明地融合到isbnlib中(您将在metabibformatters中有更多选项)。

如果您想开发插件,请从该模板开始并按照其中的说明进行操作。如需灵感,请查看goob

使用模式

该库实现了一个非常简单的 API,具有合理的默认值,但有些情况需要您注意(参见下面的案例 3)。

  1. 您只需要核心功能

# import the core functions you need
from isbnlib import canonical, is_isbn10, is_isbn13

isbn = canonical("978-0446310789")
if is_isbn13(isbn):
    ...
...
  1. 您还需要使用默认配置的元数据函数

from isbnlib import canonical, meta, description

isbn = canonical("978-0446310789")
data = meta(isbn)
...
  1. 您还需要具有特殊配置的元数据功能

    假设您需要为元数据插件添加 api 密钥并更改缓存

from myapp.utils import MyCache

# import the functions you need, plus 'config' and 'registry'
from isbnlib import canonical, config, meta, registry

# you should use 'config' first
config.add_apikey("isbndb", "kjshdfkjahsdflkjh")

# then 'registry'
registry.set_cache(MyCache())

# Only now you should use metadata functions
# (there are no adaptions for core functions,
#  so they can be used at any moment)
isbn = canonical("978-0446310789")
data = meta(isbn, service="isbndb")
...
  1. 您想在代码中构建插件或使用isbnlib.dev

    您应该非常仔细地研究dir(isbnlib.dev)中的公共方法。

注意事项

  1. 这些类针对单次调用服务而不是批量调用进行了优化。

  2. 如果你检查这个库,你会看到有很多私有模块(它们的名字以'_'开头)。不应直接访问这些模块,因为您的程序很可能会因库的进一步版本而中断!

使用isbnlib 的项目

isbntools https://github.com/xlcnd/isbntools

isbnsrv https://github.com/xlcnd/isbnsrv

打开图书馆 https://github.com/internetarchive/openlibrary

NYPL 图书馆简化 https://github.com/NYPL-Simplified

Manubot https://github.com/manubot

点差 https://github.com/DIYBookScanner/spreads

在此处查看完整列表。

帮助

如果您需要帮助,请查看github或在 stackoverflow上发布问题。

项目详情