2013-10-25 1 views
3

Я знаю, что Gutenberg (компания, предоставляющая общедоступные книги) не разрешает автоматический доступ к своему веб-сайту, однако они предоставляют их в «машиночитаемом формате» именно для этой цели , в частности RDF. Я, будучи новым, никогда не слышал об этом формате, и googling мало помог. Я приобрел модуль rdflib, который я совершенно откровенно не знаю, что с ним делать.Python, чтение файлов RDF, скремблирование книг Gutenberg

То, что я пытаюсь сделать, это извлечь текст, который, как я полагаю, легально доступен через файлы RDF, которые я загрузил. В файле РДФ есть, среди прочего, эта линия:

<dcterms:hasFormat rdf:resource="http://www.gutenberg.org/ebooks/100.txt.utf-8"/> 

Это приводит к странице Гутенберга с текстовым файлом книги, из которой я предполагаю, что программа может получить текст, хотя я не конечно, так как я не вижу различия между прямым очищением своего сайта и очищением его через файл RDF.

Итак, если текст доступен программно, как бы я это сделал?

+1

Проект Gutenberg предоставляет свой каталог в RDF, а не фактический текст книги, так что это не решит вашу проблему. – RobV

+2

@RobV. Я считаю, что точка пользователя состоит в том, что тройка ' dcterms: hasFormat "предоставляет URL-адрес для текста. Я согласен, однако, что если автоматический доступ запрещен, просто URL-адрес не помогает, поскольку доступ к нему по-прежнему будет автоматическим доступом. –

+1

Какие поиски в Google не помогли? Первые несколько запросов [поиск Google для rdf] (https://www.google.com/search?q=rdf) касаются того, что такое RDF, как он используется, как он выглядит и т. Д. –

ответ

5

Вы не найдете полный текст в RDF catalog from from Project Gutenberg. Однако он содержит URL-адреса для текста в нескольких форматах. После того как вы загрузили catalog zip file и разархивировали его, вот как получить URL-адрес HTML-книги из определенного файла RDF.

filename = 'cache/epub/78/pg78.rdf' 
from lxml import etree 
rdf = open(filename).read() 
tree = etree.fromstring(rdf) 
resource_tag = '{http://www.w3.org/1999/02/22-rdf-syntax-ns#}resource' 
hasFormat_tag = './/{http://purl.org/dc/terms/}hasFormat' 
resources = [el.attrib[resource_tag] for el in tree.findall(hasFormat_tag)] 
urls = [url for url in resources if url.endswith('htm')] 
// urls[0] is 'http://www.gutenberg.org/files/78/78-h/78-h.htm' 

Как только вы получите URL-адрес HTML-версии книги, которую вы хотите, вот как захватить текст.

import requests 
from lxml import etree 
response = requests.get(urls[0]) 
html = etree.HTML(response.text) 
text = '\n'.join([el.text for el in html.findall('.//p')]) 

text теперь содержит полный текст Tarzan, минус метаданные проекта Gutenberg, оглавления и заголовки глав.

>>> text[:100] 
u'\r\nI had this story from one who had no business to tell it to me, or to\r\nany other. I may credit th' 

Обратите внимание, что между книгами по Гутенбергу есть несоответствия, поэтому ваши результаты могут отличаться.