2013-10-25 30 views
3

我知道古騰堡(一家提供公共領域書籍的公司)不允許自動訪問他們的網站,但他們確實以「機器可讀格式」爲此提供它們,特別是RDF。我是新來的,從來沒有聽說過這種格式,而谷歌搜索沒有多大幫助。我已經獲得了rdflib模塊,我坦率地不知道該怎麼做。Python,閱讀RDF文件,刮古登堡書籍

我想要做的是提取我認爲可以通過我下載的RDF文件合法訪問的文本。在RDF文件存在,除其他外,這條線:

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

這導致從那裏我認爲程序可以獲取文本的書,文本文件中的古騰堡頁,雖然我不當然,因爲我沒有看到直接抓取他們的網站和通過RDF文件抓取它們之間的區別。

所以,如果文本是以編程方式訪問的,我該怎麼做?

+1

Project 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並解壓縮之後,下面介紹如何從特定的RDF文件獲取HTML書籍網址。

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' 

一旦你有了你想要的書的HTML版本的URL,以下是如何獲取文本。

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全文,減去Project 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' 

請注意,古登堡書籍之間存在不一致,因此您的結果可能會有所不同。