2010-06-25 22 views
23

Estoy tratando de crear un cargador de epub para iBook en python. Necesito una lib de Python para extraer información del libro. Antes de implementar esto por mí mismo, me pregunto si alguien sabe que una versión de python lib ya creada lo hace.Biblioteca de Python para extraer información de 'epub'

+2

Voy a votar para dejar abierta esta pregunta, ya que al parecer, al momento de formular la pregunta, no había una biblioteca para implementar la funcionalidad requerida, y creo que la respuesta aceptada contiene un código valioso . –

+0

El comentario no es para ti, sino para las personas que votan para cerrar la pregunta. No hay ninguna razón para no aceptar la respuesta, particularmente porque resolvió su problema. –

+0

El cierre no significa eliminar, la respuesta es atraer solo respuestas de enlace y tal vez correo no deseado en el futuro. – bummi

Respuesta

35

Un archivo .epub es un archivo zip-codificado que contiene un directorio META-INF, que contiene un archivo llamado container.xml, que apunta a otro archivo usualmente llamado Content.opf, que indexa todos los otros archivos que componen el e-book (resumen basado en http://www.jedisaber.com/eBooks/tutorial.asp; especificaciones completas en http://www.idpf.org/2007/opf/opf2.0/download/)

El siguiente código de Python extraerá la metainformación básica de un archivo .epub y la devolverá como un dict.

import zipfile 
from lxml import etree 

def get_epub_info(fname): 
    ns = { 
     'n':'urn:oasis:names:tc:opendocument:xmlns:container', 
     'pkg':'http://www.idpf.org/2007/opf', 
     'dc':'http://purl.org/dc/elements/1.1/' 
    } 

    # prepare to read from the .epub file 
    zip = zipfile.ZipFile(fname) 

    # find the contents metafile 
    txt = zip.read('META-INF/container.xml') 
    tree = etree.fromstring(txt) 
    cfname = tree.xpath('n:rootfiles/n:rootfile/@full-path',namespaces=ns)[0] 

    # grab the metadata block from the contents metafile 
    cf = zip.read(cfname) 
    tree = etree.fromstring(cf) 
    p = tree.xpath('/pkg:package/pkg:metadata',namespaces=ns)[0] 

    # repackage the data 
    res = {} 
    for s in ['title','language','creator','date','identifier']: 
     res[s] = p.xpath('dc:%s/text()'%(s),namespaces=ns)[0] 

    return res 

Salida de ejemplo:

{ 
    'date': '2009-12-26T17:03:31', 
    'identifier': '25f96ff0-7004-4bb0-b1f2-d511ca4b2756', 
    'creator': 'John Grisham', 
    'language': 'UND', 
    'title': 'Ford County' 
} 
+0

Gracias, esto funciona como esperaba. – xiamx

+0

Ambos enlaces están rotos. – OliasailO

3

¿Algo como epub-tools, por ejemplo? Pero eso es principalmente sobre escribiendo el formatoepub (de varias fuentes posibles), como es epubtools (ortografía similar, proyecto diferente). Para leyendo, probaría el proyecto complementario threepress, una aplicación de Django para mostrar libros de epub en un navegador. No he mirado ese código, pero imagino que para mostrar el libro seguramente debe ser primero capaz de leerlo ;-).

+0

epub-tools y epubtools parecen ser generadores de epub. – xiamx

+0

@xiamx, sí, "sobre todo acerca de la escritura" como dije, entonces, ¿has probado el código de tres pulsaciones? –

2

Terminé aquí después de buscar algo similar y me inspiré en el fragmento de código del Sr. Bothwell para comenzar mi propio proyecto. Si alguien está interesado ... http://epubzilla.odeegan.com/

+0

bastante útil que enlace – embert

Cuestiones relacionadas