3

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

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

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

它通向带有本书文本文件的古腾堡页面,我假设程序可以从中获取文本,但我不确定,因为我看不出直接抓取他们的网站和通过RDF 文件。

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

4

1 回答 1

5

您不会在Project Gutenberg的 RDF 目录中找到全文。不过,它确实包含多种格式的文本 URL。下载目录 zip 文件并解压缩后,以下是从特定 RDF 文件获取 HTML 图书 URL 的方法。

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'

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

于 2013-11-20T19:10:30.020 回答