Python,阅读RDF文件,抓Gutenberg书籍

时间:2013-10-25 11:45:31

标签: python-3.x rdf

我知道Gutenberg(一家提供公共领域书籍的公司)不允许自动访问他们的网站,但他们确实以“机器可读格式”提供它们,仅用于此目的,特别是RDF。我是新人,从未听说过这种格式,谷歌搜索没有多大帮助。我已经获得了rdflib模块,我坦率地不知道该怎么做。

我想要做的是提取我认为可以通过我下载的RDF文件合法访问的文本。在rdf文件中有这一行:

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

它导致Gutenberg页面带有本书的文本文件,从中我假设程序可以获取文本,但我不确定,因为我没有看到直接刮取其网站和刮取之间的区别它通过RDF文件。

因此,如果文本完全可以通过编程方式访问,我该怎么做?

1 个答案:

答案 0 :(得分: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版本的网址后,就会抓住这些文字。

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'

请注意,古腾堡的书籍之间存在不一致之处,因此您的结果可能会有所不同。