Skip to content

Instantly share code, notes, and snippets.

@paulsmith
Last active May 18, 2026 17:10
Show Gist options
  • Select an option

  • Save paulsmith/e858baf6da52cfe4e88b3613ff1d4ab2 to your computer and use it in GitHub Desktop.

Select an option

Save paulsmith/e858baf6da52cfe4e88b3613ff1d4ab2 to your computer and use it in GitHub Desktop.
Add Project Gutenberg links to a list of the Guardian's top 100 novels

Guardian Top 100 → free e-book links

Scripts that scan the Guardian's "100 best novels of all time" list and link each entry to a free e-book source. All 100 entries are linked: 43 to Project Gutenberg (the public-domain works) and 57 to OpenLibrary (still in copyright but borrowable via Internet Archive's controlled-lending program, which is the closest open-data analog to a Libby-style library link).

The list (as a markdown note) has only titles, no authors, so the scripts carry a hand-curated (title, author) table to disambiguate common titles like Emma and Persuasion during search.

Files

  • books.py — hand-curated table of 100 (rank, title, author, surname) tuples derived from the Guardian list.
  • lookup.py — queries gutendex.com for each book and writes results.json. Scoring prefers:
    1. exact title match over prefix match (so Mrs. Dalloway beats Mrs Dalloway in Bond Street),
    2. English editions over foreign-language ones (so the Lowe-Porter Buddenbrooks translation beats Mann's German original),
    3. "Complete" over per-volume splits (Henry James's Golden Bowl),
    4. lower volume numbers when only volumes exist (so Sentimental Education Volume 1 beats Volume 2),
    5. lowest PG ebook id, as a tiebreaker.
  • ol_lookup.py — runs after lookup.py and, for each book without a PG match, searches OpenLibrary by title + author surname, writing ol_results.json. Author surname (not full name) is used in the API query so transliterated records still match (e.g. Михаил Афанасьевич Булгаков for The Master and Margarita). A small override table handles the two cases where the canonical OpenLibrary record is filed under a non-English title (Die Ringe des Saturn).
  • apply.py — rewrites the Obsidian note in place, preferring the PG link when present and falling back to OpenLibrary. Each line - 100 My Ántonia becomes - 100 [My Ántonia](https://www.gutenberg.org/ebooks/242). The note uses a non-breaking space (U+00A0) between rank and title; the regex preserves it.
  • results.json / ol_results.json — full match reports for each source.
  • guardian-top-100.md — final version of the note after both passes.

Usage

python3 lookup.py     # populates results.json (a few minutes; gutendex can be slow)
python3 ol_lookup.py  # populates ol_results.json for the books PG didn't have
python3 apply.py      # rewrites ~/Documents/Obsidian/Notes/The Guardian's top 100 novels.md

Notes on misses

PG misses fell to one of three patterns: still in copyright (most of the 1928–2024 entries), available only in the original language (The Magic Mountain → only Der Zauberberg), or split across per-volume editions (In Search of Lost Time has no single PG record — Swann's Way, id 7178, exists separately if you want a per-volume link).

OpenLibrary picked up every remaining entry on the second pass, though three needed help: Life and Fate and The Master and Margarita failed until the search switched from full author name to surname only, and The Rings of Saturn required a manual override because OpenLibrary files it under its German title.

"""Rewrite the Obsidian note, linking each novel to a free e-book source.
For each entry, prefers Project Gutenberg (from results.json) and falls back
to OpenLibrary (from ol_results.json). Lines without a match in either source
are left untouched. Already-linked lines are passed through unchanged.
"""
import json
import re
import sys
from pathlib import Path
NOTE = Path.home() / "Documents/Obsidian/Notes/The Guardian's top 100 novels.md"
HERE = Path(__file__).parent
PG = "https://www.gutenberg.org/ebooks/{id}"
OL = "https://openlibrary.org{key}"
def load(name: str) -> dict[int, dict]:
path = HERE / name
if not path.exists():
return {}
return {r["rank"]: r for r in json.loads(path.read_text())}
def main() -> None:
pg = load("results.json")
ol = load("ol_results.json")
line_re = re.compile(r"^- (\d+)(\s)(.+?)\s*$")
pg_linked = ol_linked = 0
out = []
for line in NOTE.read_text().splitlines(keepends=True):
m = line_re.match(line.rstrip("\n"))
if not m:
out.append(line)
continue
rank = int(m.group(1))
sep = m.group(2)
title = m.group(3)
# If the title is already a markdown link, leave it alone.
if title.startswith("["):
out.append(line)
continue
url: str | None = None
if pg.get(rank, {}).get("pg_id"):
url = PG.format(id=pg[rank]["pg_id"])
pg_linked += 1
elif ol.get(rank, {}).get("ol_key"):
url = OL.format(key=ol[rank]["ol_key"])
ol_linked += 1
if not url:
out.append(line)
continue
nl = "\n" if line.endswith("\n") else ""
out.append(f"- {rank}{sep}[{title}]({url}){nl}")
NOTE.write_text("".join(out))
print(f"linked {pg_linked} via PG, {ol_linked} via OpenLibrary", file=sys.stderr)
if __name__ == "__main__":
main()
# Guardian top 100 novels (May 2026 list), with author and surname for lookup.
# Order: list of (rank, title_as_in_note, author_full, author_surname_for_match).
BOOKS = [
(100, "My Ántonia", "Willa Cather", "Cather"),
(99, "The Go-Between", "L. P. Hartley", "Hartley"),
(98, "The Road", "Cormac McCarthy", "McCarthy"),
(97, "Catch-22", "Joseph Heller", "Heller"),
(96, "Pedro Páramo", "Juan Rulfo", "Rulfo"),
(95, "The Return of the Native", "Thomas Hardy", "Hardy"),
(94, "The Known World", "Edward P. Jones", "Jones"),
(93, "Invisible Cities", "Italo Calvino", "Calvino"),
(92, "Sentimental Education", "Gustave Flaubert", "Flaubert"),
(91, "Life and Fate", "Vasily Grossman", "Grossman"),
(90, "Jacob's Room", "Virginia Woolf", "Woolf"),
(89, "The Left Hand of Darkness", "Ursula K. Le Guin", "Le Guin"),
(88, "Ragtime", "E. L. Doctorow", "Doctorow"),
(87, "The Line of Beauty", "Alan Hollinghurst", "Hollinghurst"),
(86, "The Turn of the Screw", "Henry James", "James"),
(85, "The Vegetarian", "Han Kang", "Han"),
(84, "The Talented Mr Ripley", "Patricia Highsmith", "Highsmith"),
(83, "A Farewell to Arms", "Ernest Hemingway", "Hemingway"),
(82, "The End of the Affair", "Graham Greene", "Greene"),
(81, "Buddenbrooks", "Thomas Mann", "Mann"),
(80, "Rebecca", "Daphne du Maurier", "Maurier"),
(79, "Go Tell It on the Mountain", "James Baldwin", "Baldwin"),
(78, "A House for Mr Biswas", "V. S. Naipaul", "Naipaul"),
(77, "The Rainbow", "D. H. Lawrence", "Lawrence"),
(76, "Dracula", "Bram Stoker", "Stoker"),
(75, "The Bluest Eye", "Toni Morrison", "Morrison"),
(74, "Nervous Conditions", "Tsitsi Dangarembga", "Dangarembga"),
(73, "Austerlitz", "W. G. Sebald", "Sebald"),
(72, "Our Mutual Friend", "Charles Dickens", "Dickens"),
(71, "Kindred", "Octavia E. Butler", "Butler"),
(70, "Jude the Obscure", "Thomas Hardy", "Hardy"),
(69, "Crime and Punishment", "Fyodor Dostoyevsky", "Dostoyevsky"),
(68, "Blood Meridian", "Cormac McCarthy", "McCarthy"),
(67, "The Man Without Qualities", "Robert Musil", "Musil"),
(66, "The Master and Margarita", "Mikhail Bulgakov", "Bulgakov"),
(65, "The Color Purple", "Alice Walker", "Walker"),
(64, "The Good Soldier", "Ford Madox Ford", "Ford"),
(63, "White Teeth", "Zadie Smith", "Smith"),
(62, "Half of a Yellow Sun", "Chimamanda Ngozi Adichie", "Adichie"),
(61, "The Rings of Saturn", "W. G. Sebald", "Sebald"),
(60, "Howards End", "E. M. Forster", "Forster"),
(59, "Never Let Me Go", "Kazuo Ishiguro", "Ishiguro"),
(58, "Disgrace", "J. M. Coetzee", "Coetzee"),
(57, "The Sound and the Fury", "William Faulkner", "Faulkner"),
(56, "Mansfield Park", "Jane Austen", "Austen"),
(55, "The Waves", "Virginia Woolf", "Woolf"),
(54, "Orlando", "Virginia Woolf", "Woolf"),
(53, "The Transit of Venus", "Shirley Hazzard", "Hazzard"),
(52, "The Golden Bowl", "Henry James", "James"),
(51, "My Brilliant Friend", "Elena Ferrante", "Ferrante"),
(50, "Wide Sargasso Sea", "Jean Rhys", "Rhys"),
(49, "A Fine Balance", "Rohinton Mistry", "Mistry"),
(48, "The Metamorphosis", "Franz Kafka", "Kafka"),
(47, "Vanity Fair", "William Makepeace Thackeray", "Thackeray"),
(46, "The Leopard", "Giuseppe Tomasi di Lampedusa", "Lampedusa"),
(45, "The Golden Notebook", "Doris Lessing", "Lessing"),
(44, "Giovanni's Room", "James Baldwin", "Baldwin"),
(43, "Housekeeping", "Marilynne Robinson", "Robinson"),
(42, "The Magic Mountain", "Thomas Mann", "Mann"),
(41, "Heart of Darkness", "Joseph Conrad", "Conrad"),
(40, "Song of Solomon", "Toni Morrison", "Morrison"),
(39, "Their Eyes Were Watching God", "Zora Neale Hurston", "Hurston"),
(38, "The Age of Innocence", "Edith Wharton", "Wharton"),
(37, "Invisible Man", "Ralph Ellison", "Ellison"),
(36, "The Handmaid's Tale", "Margaret Atwood", "Atwood"),
(35, "Great Expectations", "Charles Dickens", "Dickens"),
(34, "Wolf Hall", "Hilary Mantel", "Mantel"),
(33, "David Copperfield", "Charles Dickens", "Dickens"),
(32, "The God of Small Things", "Arundhati Roy", "Roy"),
(31, "The Prime of Miss Jean Brodie", "Muriel Spark", "Spark"),
(30, "Frankenstein", "Mary Shelley", "Shelley"),
(29, "Pale Fire", "Vladimir Nabokov", "Nabokov"),
(28, "The Brothers Karamazov", "Fyodor Dostoyevsky", "Dostoyevsky"),
(27, "The Trial", "Franz Kafka", "Kafka"),
(26, "Don Quixote", "Miguel de Cervantes", "Cervantes"),
(25, "Lolita", "Vladimir Nabokov", "Nabokov"),
(24, "The Remains of the Day", "Kazuo Ishiguro", "Ishiguro"),
(23, "Midnight's Children", "Salman Rushdie", "Rushdie"),
(22, "Things Fall Apart", "Chinua Achebe", "Achebe"),
(21, "The Portrait of a Lady", "Henry James", "James"),
(20, "Wuthering Heights", "Emily Brontë", "Brontë"),
(19, "The Life and Opinions of Tristram Shandy, Gentleman", "Laurence Sterne", "Sterne"),
(18, "Persuasion", "Jane Austen", "Austen"),
(17, "One Hundred Years of Solitude", "Gabriel García Márquez", "Márquez"),
(16, "Nineteen Eighty-Four", "George Orwell", "Orwell"),
(15, "Moby-Dick", "Herman Melville", "Melville"),
(14, "Mrs Dalloway", "Virginia Woolf", "Woolf"),
(13, "Emma", "Jane Austen", "Austen"),
(12, "Bleak House", "Charles Dickens", "Dickens"),
(11, "The Great Gatsby", "F. Scott Fitzgerald", "Fitzgerald"),
(10, "Madame Bovary", "Gustave Flaubert", "Flaubert"),
(9, "Pride and Prejudice", "Jane Austen", "Austen"),
(8, "Jane Eyre", "Charlotte Brontë", "Brontë"),
(7, "War and Peace", "Leo Tolstoy", "Tolstoy"),
(6, "Anna Karenina", "Leo Tolstoy", "Tolstoy"),
(5, "In Search of Lost Time", "Marcel Proust", "Proust"),
(4, "To the Lighthouse", "Virginia Woolf", "Woolf"),
(3, "Ulysses", "James Joyce", "Joyce"),
(2, "Beloved", "Toni Morrison", "Morrison"),
(1, "Middlemarch", "George Eliot", "Eliot"),
]

source

The list

"""Look up each Guardian top-100 novel on Project Gutenberg via gutendex.com.
Strategy: query gutendex with "title + author surname"; among results, prefer
entries whose title matches the target after normalization and whose author
metadata contains the surname. Prefer English-language editions. Output a JSON
report and a rewritten markdown list.
"""
import json
import re
import sys
import time
import unicodedata
import urllib.parse
import urllib.request
from books import BOOKS
GUTENDEX = "https://gutendex.com/books/"
PG_URL = "https://www.gutenberg.org/ebooks/{id}"
# Manual id overrides for books where the heuristic picks the wrong edition or
# misses an obvious match. Set to None to force "not on PG".
OVERRIDES: dict[int, int | None] = {}
def fetch(url: str, retries: int = 4) -> dict:
last: Exception | None = None
for i in range(retries):
try:
with urllib.request.urlopen(url, timeout=25) as r:
return json.loads(r.read())
except Exception as e: # noqa: BLE001
last = e
time.sleep(2)
assert last is not None
raise last
def normalize(s: str) -> str:
s = unicodedata.normalize("NFKD", s)
s = "".join(c for c in s if not unicodedata.combining(c))
s = s.lower()
s = s.replace("&", "and")
# Strip leading "the/a/an"
s = re.sub(r"[^a-z0-9 ]+", " ", s)
s = re.sub(r"\s+", " ", s).strip()
s = re.sub(r"^(the|a|an) ", "", s)
return s
def title_match_quality(target_norm: str, candidate: str) -> int:
"""Higher is better. 0 means no match."""
cand = normalize(candidate)
if cand == target_norm:
return 4
head = re.split(r"[;:]", candidate, maxsplit=1)[0]
if normalize(head) == target_norm:
return 3
# Prefer "Title — Complete" or "Title, Complete" over "Title — Volume 1"
if cand.startswith(target_norm + " ") and "complete" in cand:
return 2
if cand.startswith(target_norm + " "):
# Skip stray content like "Title in Bond Street" (different work).
rest = cand[len(target_norm) + 1 :]
# Allow only volume/edition markers.
if re.match(
r"(volume|vol|book|part|complete|illustrated|annotated|abridged|"
r"edition|with|a novel|an autobiography|or |b )",
rest,
):
return 1
# Generic prefix match — last resort.
return 0
return 0
def author_matches(surname: str, authors: list[dict]) -> bool:
sn = normalize(surname)
for a in authors:
if sn in normalize(a.get("name", "")):
return True
return False
def search(title: str, surname: str) -> list[dict]:
q = urllib.parse.quote_plus(f"{title} {surname}")
data = fetch(f"{GUTENDEX}?search={q}")
return data.get("results", [])
VOL_RE = re.compile(r"\b(?:volume|vol\.?|book|part)\s*(\d+)\b", re.IGNORECASE)
def volume_num(title: str) -> int:
"""Return volume number, or 0 if title has no volume marker."""
m = VOL_RE.search(title)
return int(m.group(1)) if m else 0
def pick(rank: int, title: str, surname: str, results: list[dict]) -> dict | None:
target = normalize(title)
scored = []
for b in results:
q = title_match_quality(target, b["title"])
if q == 0 or not author_matches(surname, b["authors"]):
continue
langs = b.get("languages") or []
eng = 0 if "en" in langs else 1
vol = volume_num(b["title"]) # 0 (no volume) sorts before 1, 2, …
# English first, then highest title quality, then earliest volume
# (0 = whole work / Complete; 1 = first volume of a split), then
# lowest id.
scored.append((eng, -q, vol, b["id"], b))
if not scored:
return None
scored.sort()
return scored[0][4]
def lookup(rank: int, title: str, author: str, surname: str) -> dict:
if rank in OVERRIDES:
oid = OVERRIDES[rank]
if oid is None:
return {"rank": rank, "title": title, "author": author, "pg_id": None}
b = fetch(f"{GUTENDEX}?ids={oid}")["results"][0]
return {
"rank": rank,
"title": title,
"author": author,
"pg_id": b["id"],
"pg_title": b["title"],
"pg_authors": [a["name"] for a in b["authors"]],
"pg_languages": b.get("languages"),
"source": "override",
}
results = search(title, surname)
chosen = pick(rank, title, surname, results)
if not chosen:
return {"rank": rank, "title": title, "author": author, "pg_id": None}
return {
"rank": rank,
"title": title,
"author": author,
"pg_id": chosen["id"],
"pg_title": chosen["title"],
"pg_authors": [a["name"] for a in chosen["authors"]],
"pg_languages": chosen.get("languages"),
}
def main() -> None:
out = []
for rank, title, author, surname in BOOKS:
try:
row = lookup(rank, title, author, surname)
except Exception as e: # noqa: BLE001
row = {
"rank": rank,
"title": title,
"author": author,
"pg_id": None,
"error": str(e),
}
out.append(row)
status = f"#{row['pg_id']}" if row.get("pg_id") else "—"
pg_title = row.get("pg_title", "")
print(f"{rank:>3} {status:>7} {title} ⇒ {pg_title}", flush=True)
# Persist after each row so a hang or kill leaves partial progress.
with open("results.json", "w") as f:
json.dump(out, f, indent=2, ensure_ascii=False)
time.sleep(0.25) # be polite to gutendex
if __name__ == "__main__":
main()
"""Look up unmatched novels on OpenLibrary as a Libby-adjacent fallback.
Run after lookup.py. Reads books.py and results.json; for each book without a
Project Gutenberg match, queries openlibrary.org/search.json with title +
author, picks the best matching work, and writes ol_results.json.
"""
import json
import re
import sys
import time
import unicodedata
import urllib.parse
import urllib.request
from books import BOOKS
API = "https://openlibrary.org/search.json"
SITE = "https://openlibrary.org"
FIELDS = "key,title,author_name,first_publish_year,edition_count,language"
# Manual OpenLibrary keys for books where author normalization (Cyrillic) or a
# non-English canonical title would otherwise miss a clear match.
OVERRIDES: dict[int, str] = {
66: "/works/OL39795340W", # The Master and Margarita (catalogued in Cyrillic)
61: "/works/OL46611W", # The Rings of Saturn (catalogued as Die Ringe des Saturn)
}
def fetch(url: str, retries: int = 4) -> dict:
last: Exception | None = None
for i in range(retries):
try:
with urllib.request.urlopen(url, timeout=25) as r:
return json.loads(r.read())
except Exception as e: # noqa: BLE001
last = e
time.sleep(2)
assert last is not None
raise last
def normalize(s: str) -> str:
s = unicodedata.normalize("NFKD", s)
s = "".join(c for c in s if not unicodedata.combining(c))
s = s.lower().replace("&", "and")
s = re.sub(r"[^a-z0-9 ]+", " ", s)
s = re.sub(r"\s+", " ", s).strip()
s = re.sub(r"^(the|a|an) ", "", s)
return s
def author_matches(surname: str, names: list[str]) -> bool:
sn = normalize(surname)
return any(sn in normalize(n) for n in names or [])
def search(title: str, author: str) -> list[dict]:
# OpenLibrary's author filter does literal substring matching, so pass the
# surname (the last word of the supplied author string) — full names miss
# records where the catalogued author is transliterated or in another
# script (e.g. "Михаил Афанасьевич Булгаков").
surname = author.rsplit(" ", 1)[-1]
q = urllib.parse.urlencode(
{
"title": title,
"author": surname,
"limit": "15",
"fields": FIELDS,
}
)
return fetch(f"{API}?{q}").get("docs", [])
def pick(title: str, surname: str, docs: list[dict]) -> dict | None:
target = normalize(title)
scored = []
for d in docs:
if not author_matches(surname, d.get("author_name", [])):
continue
cand = normalize(d.get("title", ""))
if cand == target:
q = 3
elif cand.startswith(target + " ") or target in cand:
q = 1
else:
continue
langs = d.get("language") or []
eng = 0 if "eng" in langs else 1
editions = d.get("edition_count") or 0
# Higher quality wins, then English, then most editions (canonical).
scored.append((-q, eng, -editions, d))
if not scored:
return None
scored.sort(key=lambda t: (t[0], t[1], t[2]))
return scored[0][3]
def fetch_work(key: str) -> dict:
data = fetch(f"{SITE}{key}.json")
return {
"key": data["key"],
"title": data.get("title", ""),
"author_name": [],
"language": [],
"edition_count": None,
}
def lookup(rank: int, title: str, author: str, surname: str) -> dict:
if rank in OVERRIDES:
chosen = fetch_work(OVERRIDES[rank])
else:
docs = search(title, author)
chosen = pick(title, surname, docs)
if not chosen:
return {"rank": rank, "title": title, "author": author, "ol_key": None}
return {
"rank": rank,
"title": title,
"author": author,
"ol_key": chosen["key"],
"ol_title": chosen.get("title"),
"ol_authors": chosen.get("author_name"),
"ol_first_publish_year": chosen.get("first_publish_year"),
"ol_edition_count": chosen.get("edition_count"),
}
def main() -> None:
with open("results.json") as f:
gut = {r["rank"]: r for r in json.load(f)}
out = []
for rank, title, author, surname in BOOKS:
if gut.get(rank, {}).get("pg_id"):
continue # already linked to Project Gutenberg
try:
row = lookup(rank, title, author, surname)
except Exception as e: # noqa: BLE001
row = {
"rank": rank,
"title": title,
"author": author,
"ol_key": None,
"error": str(e),
}
out.append(row)
status = row.get("ol_key") or "—"
ol_title = row.get("ol_title", "")
print(f"{rank:>3} {status:>16} {title} ⇒ {ol_title}", flush=True)
with open("ol_results.json", "w") as f:
json.dump(out, f, indent=2, ensure_ascii=False)
time.sleep(0.5)
if __name__ == "__main__":
main()
[
{
"rank": 99,
"title": "The Go-Between",
"author": "L. P. Hartley",
"ol_key": "/works/OL2047674W",
"ol_title": "The Go-Between",
"ol_authors": [
"L. P. Hartley"
],
"ol_first_publish_year": 1953,
"ol_edition_count": 35
},
{
"rank": 98,
"title": "The Road",
"author": "Cormac McCarthy",
"ol_key": "/works/OL40873W",
"ol_title": "The Road",
"ol_authors": [
"Cormac McCarthy"
],
"ol_first_publish_year": 2006,
"ol_edition_count": 69
},
{
"rank": 97,
"title": "Catch-22",
"author": "Joseph Heller",
"ol_key": "/works/OL276798W",
"ol_title": "Catch-22",
"ol_authors": [
"Joseph Heller"
],
"ol_first_publish_year": 1961,
"ol_edition_count": 134
},
{
"rank": 96,
"title": "Pedro Páramo",
"author": "Juan Rulfo",
"ol_key": "/works/OL1731119W",
"ol_title": "Pedro Páramo",
"ol_authors": [
"Juan Rulfo"
],
"ol_first_publish_year": 1955,
"ol_edition_count": 134
},
{
"rank": 94,
"title": "The Known World",
"author": "Edward P. Jones",
"ol_key": "/works/OL4112928W",
"ol_title": "The Known World",
"ol_authors": [
"Edward P. Jones"
],
"ol_first_publish_year": 2003,
"ol_edition_count": 31
},
{
"rank": 93,
"title": "Invisible Cities",
"author": "Italo Calvino",
"ol_key": "/works/OL24233895W",
"ol_title": "Invisible Cities",
"ol_authors": [
"Italo Calvino",
"William Weaver 1923"
],
"ol_first_publish_year": 2010,
"ol_edition_count": 3
},
{
"rank": 91,
"title": "Life and Fate",
"author": "Vasily Grossman",
"ol_key": "/works/OL43262197W",
"ol_title": "Life and fate",
"ol_authors": [
"Vasiliĭ Semenovich Grossman"
],
"ol_first_publish_year": 1986,
"ol_edition_count": 1
},
{
"rank": 89,
"title": "The Left Hand of Darkness",
"author": "Ursula K. Le Guin",
"ol_key": "/works/OL59800W",
"ol_title": "The Left Hand of Darkness",
"ol_authors": [
"Ursula K. Le Guin"
],
"ol_first_publish_year": 1969,
"ol_edition_count": 91
},
{
"rank": 88,
"title": "Ragtime",
"author": "E. L. Doctorow",
"ol_key": "/works/OL55239W",
"ol_title": "Ragtime",
"ol_authors": [
"E. L. Doctorow"
],
"ol_first_publish_year": 1974,
"ol_edition_count": 20
},
{
"rank": 87,
"title": "The Line of Beauty",
"author": "Alan Hollinghurst",
"ol_key": "/works/OL1993508W",
"ol_title": "The Line of Beauty",
"ol_authors": [
"Alan Hollinghurst"
],
"ol_first_publish_year": 2004,
"ol_edition_count": 19
},
{
"rank": 85,
"title": "The Vegetarian",
"author": "Han Kang",
"ol_key": "/works/OL38656067W",
"ol_title": "Vegetariana / the Vegetarian",
"ol_authors": [
"Han Kang"
],
"ol_first_publish_year": 2016,
"ol_edition_count": 2
},
{
"rank": 84,
"title": "The Talented Mr Ripley",
"author": "Patricia Highsmith",
"ol_key": "/works/OL59434W",
"ol_title": "The Talented Mr. Ripley",
"ol_authors": [
"Patricia Highsmith"
],
"ol_first_publish_year": 1955,
"ol_edition_count": 70
},
{
"rank": 82,
"title": "The End of the Affair",
"author": "Graham Greene",
"ol_key": "/works/OL106073W",
"ol_title": "The end of the affair",
"ol_authors": [
"Graham Greene"
],
"ol_first_publish_year": 1951,
"ol_edition_count": 38
},
{
"rank": 80,
"title": "Rebecca",
"author": "Daphne du Maurier",
"ol_key": "/works/OL36633W",
"ol_title": "Rebecca",
"ol_authors": [
"Daphne du Maurier"
],
"ol_first_publish_year": 1938,
"ol_edition_count": 200
},
{
"rank": 79,
"title": "Go Tell It on the Mountain",
"author": "James Baldwin",
"ol_key": "/works/OL228705W",
"ol_title": "Go Tell It on the Mountain",
"ol_authors": [
"James Baldwin"
],
"ol_first_publish_year": 1952,
"ol_edition_count": 66
},
{
"rank": 78,
"title": "A House for Mr Biswas",
"author": "V. S. Naipaul",
"ol_key": "/works/OL103113W",
"ol_title": "A House for Mr. Biswas",
"ol_authors": [
"V. S. Naipaul"
],
"ol_first_publish_year": 1961,
"ol_edition_count": 22
},
{
"rank": 75,
"title": "The Bluest Eye",
"author": "Toni Morrison",
"ol_key": "/works/OL50565W",
"ol_title": "The Bluest Eye",
"ol_authors": [
"Toni Morrison"
],
"ol_first_publish_year": 1970,
"ol_edition_count": 63
},
{
"rank": 74,
"title": "Nervous Conditions",
"author": "Tsitsi Dangarembga",
"ol_key": "/works/OL17661158W",
"ol_title": "Nervous Conditions",
"ol_authors": [
"Tsitsi Dangarembga"
],
"ol_first_publish_year": 1988,
"ol_edition_count": 21
},
{
"rank": 73,
"title": "Austerlitz",
"author": "W. G. Sebald",
"ol_key": "/works/OL46615W",
"ol_title": "Austerlitz",
"ol_authors": [
"W. G. Sebald",
"Anthea Bell"
],
"ol_first_publish_year": 2001,
"ol_edition_count": 25
},
{
"rank": 71,
"title": "Kindred",
"author": "Octavia E. Butler",
"ol_key": "/works/OL35616W",
"ol_title": "Kindred",
"ol_authors": [
"Octavia E. Butler",
"SparkNotes"
],
"ol_first_publish_year": 1979,
"ol_edition_count": 29
},
{
"rank": 68,
"title": "Blood Meridian",
"author": "Cormac McCarthy",
"ol_key": "/works/OL40879W",
"ol_title": "Blood Meridian",
"ol_authors": [
"Cormac McCarthy"
],
"ol_first_publish_year": 1985,
"ol_edition_count": 28
},
{
"rank": 67,
"title": "The Man Without Qualities",
"author": "Robert Musil",
"ol_key": "/works/OL20498876W",
"ol_title": "The Man Without Qualities",
"ol_authors": [
"Robert Musil"
],
"ol_first_publish_year": 1979,
"ol_edition_count": 5
},
{
"rank": 66,
"title": "The Master and Margarita",
"author": "Mikhail Bulgakov",
"ol_key": "/works/OL39795340W",
"ol_title": "Master and Margarita",
"ol_authors": [],
"ol_first_publish_year": null,
"ol_edition_count": null
},
{
"rank": 65,
"title": "The Color Purple",
"author": "Alice Walker",
"ol_key": "/works/OL273644W",
"ol_title": "The Color Purple",
"ol_authors": [
"Alice Walker"
],
"ol_first_publish_year": 1976,
"ol_edition_count": 107
},
{
"rank": 63,
"title": "White Teeth",
"author": "Zadie Smith",
"ol_key": "/works/OL481143W",
"ol_title": "White Teeth",
"ol_authors": [
"Zadie Smith"
],
"ol_first_publish_year": 2000,
"ol_edition_count": 48
},
{
"rank": 62,
"title": "Half of a Yellow Sun",
"author": "Chimamanda Ngozi Adichie",
"ol_key": "/works/OL5731542W",
"ol_title": "Half of a Yellow Sun",
"ol_authors": [
"Chimamanda Ngozi Adichie"
],
"ol_first_publish_year": 2006,
"ol_edition_count": 40
},
{
"rank": 61,
"title": "The Rings of Saturn",
"author": "W. G. Sebald",
"ol_key": "/works/OL46611W",
"ol_title": "Die Ringe des Saturn",
"ol_authors": [],
"ol_first_publish_year": null,
"ol_edition_count": null
},
{
"rank": 59,
"title": "Never Let Me Go",
"author": "Kazuo Ishiguro",
"ol_key": "/works/OL59038W",
"ol_title": "Never Let Me Go",
"ol_authors": [
"Kazuo Ishiguro"
],
"ol_first_publish_year": 2005,
"ol_edition_count": 47
},
{
"rank": 58,
"title": "Disgrace",
"author": "J. M. Coetzee",
"ol_key": "/works/OL500451W",
"ol_title": "Disgrace",
"ol_authors": [
"J. M. Coetzee"
],
"ol_first_publish_year": 1999,
"ol_edition_count": 56
},
{
"rank": 55,
"title": "The Waves",
"author": "Virginia Woolf",
"ol_key": "/works/OL39316W",
"ol_title": "The Waves",
"ol_authors": [
"Virginia Woolf"
],
"ol_first_publish_year": 1931,
"ol_edition_count": 255
},
{
"rank": 54,
"title": "Orlando",
"author": "Virginia Woolf",
"ol_key": "/works/OL39360W",
"ol_title": "Orlando",
"ol_authors": [
"Virginia Woolf"
],
"ol_first_publish_year": 1928,
"ol_edition_count": 452
},
{
"rank": 53,
"title": "The Transit of Venus",
"author": "Shirley Hazzard",
"ol_key": "/works/OL103066W",
"ol_title": "The Transit of Venus",
"ol_authors": [
"Shirley Hazzard"
],
"ol_first_publish_year": 1980,
"ol_edition_count": 7
},
{
"rank": 51,
"title": "My Brilliant Friend",
"author": "Elena Ferrante",
"ol_key": "/works/OL34947113W",
"ol_title": "My Brilliant Friend",
"ol_authors": [
"Chiara Lagani",
"Elena Ferrante",
"Mara Cerri"
],
"ol_first_publish_year": 2023,
"ol_edition_count": 1
},
{
"rank": 50,
"title": "Wide Sargasso Sea",
"author": "Jean Rhys",
"ol_key": "/works/OL1858668W",
"ol_title": "Wide Sargasso Sea",
"ol_authors": [
"Jean Rhys"
],
"ol_first_publish_year": 1966,
"ol_edition_count": 48
},
{
"rank": 49,
"title": "A Fine Balance",
"author": "Rohinton Mistry",
"ol_key": "/works/OL2980902W",
"ol_title": "A Fine Balance",
"ol_authors": [
"Rohinton Mistry"
],
"ol_first_publish_year": 1995,
"ol_edition_count": 35
},
{
"rank": 46,
"title": "The Leopard",
"author": "Giuseppe Tomasi di Lampedusa",
"ol_key": "/works/OL31375629W",
"ol_title": "The Leopard",
"ol_authors": [
"Giuseppe Di Lampedusa"
],
"ol_first_publish_year": 1958,
"ol_edition_count": 5
},
{
"rank": 45,
"title": "The Golden Notebook",
"author": "Doris Lessing",
"ol_key": "/works/OL31259W",
"ol_title": "The Golden Notebook",
"ol_authors": [
"Doris Lessing"
],
"ol_first_publish_year": 1962,
"ol_edition_count": 67
},
{
"rank": 44,
"title": "Giovanni's Room",
"author": "James Baldwin",
"ol_key": "/works/OL228702W",
"ol_title": "Giovanni's Room",
"ol_authors": [
"James Baldwin"
],
"ol_first_publish_year": 1956,
"ol_edition_count": 65
},
{
"rank": 43,
"title": "Housekeeping",
"author": "Marilynne Robinson",
"ol_key": "/works/OL1875010W",
"ol_title": "Housekeeping",
"ol_authors": [
"Marilynne Robinson"
],
"ol_first_publish_year": 1980,
"ol_edition_count": 33
},
{
"rank": 42,
"title": "The Magic Mountain",
"author": "Thomas Mann",
"ol_key": "/works/OL43268713W",
"ol_title": "The Magic Mountain",
"ol_authors": [
"Thomas Mann"
],
"ol_first_publish_year": 1924,
"ol_edition_count": 3
},
{
"rank": 40,
"title": "Song of Solomon",
"author": "Toni Morrison",
"ol_key": "/works/OL50564W",
"ol_title": "Song of Solomon",
"ol_authors": [
"Toni Morrison"
],
"ol_first_publish_year": 1634,
"ol_edition_count": 60
},
{
"rank": 39,
"title": "Their Eyes Were Watching God",
"author": "Zora Neale Hurston",
"ol_key": "/works/OL27778127W",
"ol_title": "Their Eyes Were Watching God",
"ol_authors": [
"Zora Neale Hurston"
],
"ol_first_publish_year": 1937,
"ol_edition_count": 66
},
{
"rank": 37,
"title": "Invisible Man",
"author": "Ralph Ellison",
"ol_key": "/works/OL495470W",
"ol_title": "Invisible Man",
"ol_authors": [
"Ralph Ellison"
],
"ol_first_publish_year": 1952,
"ol_edition_count": 59
},
{
"rank": 36,
"title": "The Handmaid's Tale",
"author": "Margaret Atwood",
"ol_key": "/works/OL675783W",
"ol_title": "The Handmaid's Tale",
"ol_authors": [
"Margaret Atwood"
],
"ol_first_publish_year": 1985,
"ol_edition_count": 164
},
{
"rank": 34,
"title": "Wolf Hall",
"author": "Hilary Mantel",
"ol_key": "/works/OL464512W",
"ol_title": "Wolf Hall",
"ol_authors": [
"Hilary Mantel"
],
"ol_first_publish_year": 2009,
"ol_edition_count": 43
},
{
"rank": 32,
"title": "The God of Small Things",
"author": "Arundhati Roy",
"ol_key": "/works/OL1052133W",
"ol_title": "The God of Small Things",
"ol_authors": [
"Arundhati Roy"
],
"ol_first_publish_year": 1997,
"ol_edition_count": 65
},
{
"rank": 31,
"title": "The Prime of Miss Jean Brodie",
"author": "Muriel Spark",
"ol_key": "/works/OL26437W",
"ol_title": "The Prime of Miss Jean Brodie",
"ol_authors": [
"Muriel Spark"
],
"ol_first_publish_year": 1961,
"ol_edition_count": 59
},
{
"rank": 29,
"title": "Pale Fire",
"author": "Vladimir Nabokov",
"ol_key": "/works/OL627081W",
"ol_title": "Pale Fire",
"ol_authors": [
"Vladimir Nabokov"
],
"ol_first_publish_year": 1945,
"ol_edition_count": 58
},
{
"rank": 25,
"title": "Lolita",
"author": "Vladimir Nabokov",
"ol_key": "/works/OL627084W",
"ol_title": "Lolita",
"ol_authors": [
"Vladimir Nabokov"
],
"ol_first_publish_year": 1777,
"ol_edition_count": 228
},
{
"rank": 24,
"title": "The Remains of the Day",
"author": "Kazuo Ishiguro",
"ol_key": "/works/OL59048W",
"ol_title": "The Remains of the Day",
"ol_authors": [
"Kazuo Ishiguro"
],
"ol_first_publish_year": 1989,
"ol_edition_count": 64
},
{
"rank": 23,
"title": "Midnight's Children",
"author": "Salman Rushdie",
"ol_key": "/works/OL457179W",
"ol_title": "Midnight's Children",
"ol_authors": [
"Salman Rushdie"
],
"ol_first_publish_year": 1981,
"ol_edition_count": 71
},
{
"rank": 22,
"title": "Things Fall Apart",
"author": "Chinua Achebe",
"ol_key": "/works/OL891786W",
"ol_title": "Things Fall Apart",
"ol_authors": [
"Chinua Achebe"
],
"ol_first_publish_year": 1958,
"ol_edition_count": 94
},
{
"rank": 17,
"title": "One Hundred Years of Solitude",
"author": "Gabriel García Márquez",
"ol_key": "/works/OL29355621W",
"ol_title": "One Hundred Years of Solitude",
"ol_authors": [
"Gregory Rabassa",
"Gabriel García Márquez"
],
"ol_first_publish_year": 2007,
"ol_edition_count": 2
},
{
"rank": 16,
"title": "Nineteen Eighty-Four",
"author": "George Orwell",
"ol_key": "/works/OL1168083W",
"ol_title": "Nineteen Eighty-Four",
"ol_authors": [
"George Orwell"
],
"ol_first_publish_year": 1949,
"ol_edition_count": 535
},
{
"rank": 5,
"title": "In Search of Lost Time",
"author": "Marcel Proust",
"ol_key": "/works/OL38078207W",
"ol_title": "In Search of Lost Time",
"ol_authors": [
"Marcel Proust"
],
"ol_first_publish_year": 2015,
"ol_edition_count": 3
},
{
"rank": 4,
"title": "To the Lighthouse",
"author": "Virginia Woolf",
"ol_key": "/works/OL39396W",
"ol_title": "To the Lighthouse",
"ol_authors": [
"Virginia Woolf"
],
"ol_first_publish_year": 1927,
"ol_edition_count": 521
},
{
"rank": 2,
"title": "Beloved",
"author": "Toni Morrison",
"ol_key": "/works/OL50548W",
"ol_title": "Beloved",
"ol_authors": [
"Toni Morrison"
],
"ol_first_publish_year": 1987,
"ol_edition_count": 107
}
]
[
{
"rank": 100,
"title": "My Ántonia",
"author": "Willa Cather",
"pg_id": 242,
"pg_title": "My Ántonia",
"pg_authors": [
"Cather, Willa"
],
"pg_languages": [
"en"
]
},
{
"rank": 99,
"title": "The Go-Between",
"author": "L. P. Hartley",
"pg_id": null
},
{
"rank": 98,
"title": "The Road",
"author": "Cormac McCarthy",
"pg_id": null
},
{
"rank": 97,
"title": "Catch-22",
"author": "Joseph Heller",
"pg_id": null
},
{
"rank": 96,
"title": "Pedro Páramo",
"author": "Juan Rulfo",
"pg_id": null
},
{
"rank": 95,
"title": "The Return of the Native",
"author": "Thomas Hardy",
"pg_id": 122,
"pg_title": "The Return of the Native",
"pg_authors": [
"Hardy, Thomas"
],
"pg_languages": [
"en"
]
},
{
"rank": 94,
"title": "The Known World",
"author": "Edward P. Jones",
"pg_id": null
},
{
"rank": 93,
"title": "Invisible Cities",
"author": "Italo Calvino",
"pg_id": null
},
{
"rank": 92,
"title": "Sentimental Education",
"author": "Gustave Flaubert",
"pg_id": 34828,
"pg_title": "Sentimental Education; Or, The History of a Young Man. Volume 1",
"pg_authors": [
"Flaubert, Gustave"
],
"pg_languages": [
"en"
]
},
{
"rank": 91,
"title": "Life and Fate",
"author": "Vasily Grossman",
"pg_id": null
},
{
"rank": 90,
"title": "Jacob's Room",
"author": "Virginia Woolf",
"pg_id": 5670,
"pg_title": "Jacob's Room",
"pg_authors": [
"Woolf, Virginia"
],
"pg_languages": [
"en"
]
},
{
"rank": 89,
"title": "The Left Hand of Darkness",
"author": "Ursula K. Le Guin",
"pg_id": null
},
{
"rank": 88,
"title": "Ragtime",
"author": "E. L. Doctorow",
"pg_id": null
},
{
"rank": 87,
"title": "The Line of Beauty",
"author": "Alan Hollinghurst",
"pg_id": null
},
{
"rank": 86,
"title": "The Turn of the Screw",
"author": "Henry James",
"pg_id": 209,
"pg_title": "The Turn of the Screw",
"pg_authors": [
"James, Henry"
],
"pg_languages": [
"en"
]
},
{
"rank": 85,
"title": "The Vegetarian",
"author": "Han Kang",
"pg_id": null
},
{
"rank": 84,
"title": "The Talented Mr Ripley",
"author": "Patricia Highsmith",
"pg_id": null
},
{
"rank": 83,
"title": "A Farewell to Arms",
"author": "Ernest Hemingway",
"pg_id": 75201,
"pg_title": "A farewell to arms",
"pg_authors": [
"Hemingway, Ernest"
],
"pg_languages": [
"en"
]
},
{
"rank": 82,
"title": "The End of the Affair",
"author": "Graham Greene",
"pg_id": null
},
{
"rank": 81,
"title": "Buddenbrooks",
"author": "Thomas Mann",
"pg_id": 72961,
"pg_title": "Buddenbrooks, volume 1 of 2",
"pg_authors": [
"Mann, Thomas"
],
"pg_languages": [
"en"
]
},
{
"rank": 80,
"title": "Rebecca",
"author": "Daphne du Maurier",
"pg_id": null
},
{
"rank": 79,
"title": "Go Tell It on the Mountain",
"author": "James Baldwin",
"pg_id": null
},
{
"rank": 78,
"title": "A House for Mr Biswas",
"author": "V. S. Naipaul",
"pg_id": null
},
{
"rank": 77,
"title": "The Rainbow",
"author": "D. H. Lawrence",
"pg_id": 28948,
"pg_title": "The Rainbow",
"pg_authors": [
"Lawrence, D. H. (David Herbert)"
],
"pg_languages": [
"en"
]
},
{
"rank": 76,
"title": "Dracula",
"author": "Bram Stoker",
"pg_id": 345,
"pg_title": "Dracula",
"pg_authors": [
"Stoker, Bram"
],
"pg_languages": [
"en"
]
},
{
"rank": 75,
"title": "The Bluest Eye",
"author": "Toni Morrison",
"pg_id": null
},
{
"rank": 74,
"title": "Nervous Conditions",
"author": "Tsitsi Dangarembga",
"pg_id": null
},
{
"rank": 73,
"title": "Austerlitz",
"author": "W. G. Sebald",
"pg_id": null
},
{
"rank": 72,
"title": "Our Mutual Friend",
"author": "Charles Dickens",
"pg_id": 883,
"pg_title": "Our Mutual Friend",
"pg_authors": [
"Dickens, Charles"
],
"pg_languages": [
"en"
]
},
{
"rank": 71,
"title": "Kindred",
"author": "Octavia E. Butler",
"pg_id": null
},
{
"rank": 70,
"title": "Jude the Obscure",
"author": "Thomas Hardy",
"pg_id": 153,
"pg_title": "Jude the Obscure",
"pg_authors": [
"Hardy, Thomas"
],
"pg_languages": [
"en"
]
},
{
"rank": 69,
"title": "Crime and Punishment",
"author": "Fyodor Dostoyevsky",
"pg_id": 2554,
"pg_title": "Crime and Punishment",
"pg_authors": [
"Dostoyevsky, Fyodor"
],
"pg_languages": [
"en"
]
},
{
"rank": 68,
"title": "Blood Meridian",
"author": "Cormac McCarthy",
"pg_id": null
},
{
"rank": 67,
"title": "The Man Without Qualities",
"author": "Robert Musil",
"pg_id": null
},
{
"rank": 66,
"title": "The Master and Margarita",
"author": "Mikhail Bulgakov",
"pg_id": null
},
{
"rank": 65,
"title": "The Color Purple",
"author": "Alice Walker",
"pg_id": null
},
{
"rank": 64,
"title": "The Good Soldier",
"author": "Ford Madox Ford",
"pg_id": 2775,
"pg_title": "The Good Soldier",
"pg_authors": [
"Ford, Ford Madox"
],
"pg_languages": [
"en"
]
},
{
"rank": 63,
"title": "White Teeth",
"author": "Zadie Smith",
"pg_id": null
},
{
"rank": 62,
"title": "Half of a Yellow Sun",
"author": "Chimamanda Ngozi Adichie",
"pg_id": null
},
{
"rank": 61,
"title": "The Rings of Saturn",
"author": "W. G. Sebald",
"pg_id": null
},
{
"rank": 60,
"title": "Howards End",
"author": "E. M. Forster",
"pg_id": 2891,
"pg_title": "Howards End",
"pg_authors": [
"Forster, E. M. (Edward Morgan)"
],
"pg_languages": [
"en"
]
},
{
"rank": 59,
"title": "Never Let Me Go",
"author": "Kazuo Ishiguro",
"pg_id": null
},
{
"rank": 58,
"title": "Disgrace",
"author": "J. M. Coetzee",
"pg_id": null
},
{
"rank": 57,
"title": "The Sound and the Fury",
"author": "William Faulkner",
"pg_id": 75170,
"pg_title": "The sound and the fury",
"pg_authors": [
"Faulkner, William"
],
"pg_languages": [
"en"
]
},
{
"rank": 56,
"title": "Mansfield Park",
"author": "Jane Austen",
"pg_id": 141,
"pg_title": "Mansfield Park",
"pg_authors": [
"Austen, Jane"
],
"pg_languages": [
"en"
]
},
{
"rank": 55,
"title": "The Waves",
"author": "Virginia Woolf",
"pg_id": null
},
{
"rank": 54,
"title": "Orlando",
"author": "Virginia Woolf",
"pg_id": null
},
{
"rank": 53,
"title": "The Transit of Venus",
"author": "Shirley Hazzard",
"pg_id": null
},
{
"rank": 52,
"title": "The Golden Bowl",
"author": "Henry James",
"pg_id": 4264,
"pg_title": "The Golden Bowl — Complete",
"pg_authors": [
"James, Henry"
],
"pg_languages": [
"en"
]
},
{
"rank": 51,
"title": "My Brilliant Friend",
"author": "Elena Ferrante",
"pg_id": null
},
{
"rank": 50,
"title": "Wide Sargasso Sea",
"author": "Jean Rhys",
"pg_id": null
},
{
"rank": 49,
"title": "A Fine Balance",
"author": "Rohinton Mistry",
"pg_id": null
},
{
"rank": 48,
"title": "The Metamorphosis",
"author": "Franz Kafka",
"pg_id": 26298,
"pg_title": "The Metamorphosis",
"pg_authors": [
"Kafka, Franz"
],
"pg_languages": [
"en"
]
},
{
"rank": 47,
"title": "Vanity Fair",
"author": "William Makepeace Thackeray",
"pg_id": 599,
"pg_title": "Vanity Fair",
"pg_authors": [
"Thackeray, William Makepeace"
],
"pg_languages": [
"en"
]
},
{
"rank": 46,
"title": "The Leopard",
"author": "Giuseppe Tomasi di Lampedusa",
"pg_id": null
},
{
"rank": 45,
"title": "The Golden Notebook",
"author": "Doris Lessing",
"pg_id": null
},
{
"rank": 44,
"title": "Giovanni's Room",
"author": "James Baldwin",
"pg_id": null
},
{
"rank": 43,
"title": "Housekeeping",
"author": "Marilynne Robinson",
"pg_id": null
},
{
"rank": 42,
"title": "The Magic Mountain",
"author": "Thomas Mann",
"pg_id": null
},
{
"rank": 41,
"title": "Heart of Darkness",
"author": "Joseph Conrad",
"pg_id": 219,
"pg_title": "Heart of Darkness",
"pg_authors": [
"Conrad, Joseph"
],
"pg_languages": [
"en"
]
},
{
"rank": 40,
"title": "Song of Solomon",
"author": "Toni Morrison",
"pg_id": null
},
{
"rank": 39,
"title": "Their Eyes Were Watching God",
"author": "Zora Neale Hurston",
"pg_id": null
},
{
"rank": 38,
"title": "The Age of Innocence",
"author": "Edith Wharton",
"pg_id": 541,
"pg_title": "The Age of Innocence",
"pg_authors": [
"Wharton, Edith"
],
"pg_languages": [
"en"
]
},
{
"rank": 37,
"title": "Invisible Man",
"author": "Ralph Ellison",
"pg_id": null
},
{
"rank": 36,
"title": "The Handmaid's Tale",
"author": "Margaret Atwood",
"pg_id": null
},
{
"rank": 35,
"title": "Great Expectations",
"author": "Charles Dickens",
"pg_id": 1400,
"pg_title": "Great Expectations",
"pg_authors": [
"Dickens, Charles"
],
"pg_languages": [
"en"
]
},
{
"rank": 34,
"title": "Wolf Hall",
"author": "Hilary Mantel",
"pg_id": null
},
{
"rank": 33,
"title": "David Copperfield",
"author": "Charles Dickens",
"pg_id": 766,
"pg_title": "David Copperfield",
"pg_authors": [
"Dickens, Charles"
],
"pg_languages": [
"en"
]
},
{
"rank": 32,
"title": "The God of Small Things",
"author": "Arundhati Roy",
"pg_id": null
},
{
"rank": 31,
"title": "The Prime of Miss Jean Brodie",
"author": "Muriel Spark",
"pg_id": null
},
{
"rank": 30,
"title": "Frankenstein",
"author": "Mary Shelley",
"pg_id": 6542,
"pg_title": "Frankenstein",
"pg_authors": [
"Shelley, Mary Wollstonecraft"
],
"pg_languages": [
"en"
]
},
{
"rank": 29,
"title": "Pale Fire",
"author": "Vladimir Nabokov",
"pg_id": null
},
{
"rank": 28,
"title": "The Brothers Karamazov",
"author": "Fyodor Dostoyevsky",
"pg_id": 28054,
"pg_title": "The Brothers Karamazov",
"pg_authors": [
"Dostoyevsky, Fyodor"
],
"pg_languages": [
"en"
]
},
{
"rank": 27,
"title": "The Trial",
"author": "Franz Kafka",
"pg_id": 7849,
"pg_title": "The Trial",
"pg_authors": [
"Kafka, Franz"
],
"pg_languages": [
"en"
]
},
{
"rank": 26,
"title": "Don Quixote",
"author": "Miguel de Cervantes",
"pg_id": 996,
"pg_title": "Don Quixote",
"pg_authors": [
"Cervantes Saavedra, Miguel de"
],
"pg_languages": [
"en"
]
},
{
"rank": 25,
"title": "Lolita",
"author": "Vladimir Nabokov",
"pg_id": null
},
{
"rank": 24,
"title": "The Remains of the Day",
"author": "Kazuo Ishiguro",
"pg_id": null
},
{
"rank": 23,
"title": "Midnight's Children",
"author": "Salman Rushdie",
"pg_id": null
},
{
"rank": 22,
"title": "Things Fall Apart",
"author": "Chinua Achebe",
"pg_id": null
},
{
"rank": 21,
"title": "The Portrait of a Lady",
"author": "Henry James",
"pg_id": 2833,
"pg_title": "The Portrait of a Lady — Volume 1",
"pg_authors": [
"James, Henry"
],
"pg_languages": [
"en"
]
},
{
"rank": 20,
"title": "Wuthering Heights",
"author": "Emily Brontë",
"pg_id": 768,
"pg_title": "Wuthering Heights",
"pg_authors": [
"Brontë, Emily"
],
"pg_languages": [
"en"
]
},
{
"rank": 19,
"title": "The Life and Opinions of Tristram Shandy, Gentleman",
"author": "Laurence Sterne",
"pg_id": 1079,
"pg_title": "The life and opinions of Tristram Shandy, gentleman",
"pg_authors": [
"Sterne, Laurence"
],
"pg_languages": [
"en"
]
},
{
"rank": 18,
"title": "Persuasion",
"author": "Jane Austen",
"pg_id": 105,
"pg_title": "Persuasion",
"pg_authors": [
"Austen, Jane"
],
"pg_languages": [
"en"
]
},
{
"rank": 17,
"title": "One Hundred Years of Solitude",
"author": "Gabriel García Márquez",
"pg_id": null
},
{
"rank": 16,
"title": "Nineteen Eighty-Four",
"author": "George Orwell",
"pg_id": null
},
{
"rank": 15,
"title": "Moby-Dick",
"author": "Herman Melville",
"pg_id": 15,
"pg_title": "Moby-Dick; or, The Whale",
"pg_authors": [
"Melville, Herman"
],
"pg_languages": [
"en"
]
},
{
"rank": 14,
"title": "Mrs Dalloway",
"author": "Virginia Woolf",
"pg_id": 71865,
"pg_title": "Mrs. Dalloway",
"pg_authors": [
"Woolf, Virginia"
],
"pg_languages": [
"en"
]
},
{
"rank": 13,
"title": "Emma",
"author": "Jane Austen",
"pg_id": 158,
"pg_title": "Emma",
"pg_authors": [
"Austen, Jane"
],
"pg_languages": [
"en"
]
},
{
"rank": 12,
"title": "Bleak House",
"author": "Charles Dickens",
"pg_id": 1023,
"pg_title": "Bleak House",
"pg_authors": [
"Dickens, Charles"
],
"pg_languages": [
"en"
]
},
{
"rank": 11,
"title": "The Great Gatsby",
"author": "F. Scott Fitzgerald",
"pg_id": 64317,
"pg_title": "The Great Gatsby",
"pg_authors": [
"Fitzgerald, F. Scott (Francis Scott)"
],
"pg_languages": [
"en"
]
},
{
"rank": 10,
"title": "Madame Bovary",
"author": "Gustave Flaubert",
"pg_id": 2413,
"pg_title": "Madame Bovary",
"pg_authors": [
"Flaubert, Gustave"
],
"pg_languages": [
"en"
]
},
{
"rank": 9,
"title": "Pride and Prejudice",
"author": "Jane Austen",
"pg_id": 1342,
"pg_title": "Pride and Prejudice",
"pg_authors": [
"Austen, Jane"
],
"pg_languages": [
"en"
]
},
{
"rank": 8,
"title": "Jane Eyre",
"author": "Charlotte Brontë",
"pg_id": 23077,
"pg_title": "Jane Eyre",
"pg_authors": [
"Brontë, Charlotte"
],
"pg_languages": [
"en"
]
},
{
"rank": 7,
"title": "War and Peace",
"author": "Leo Tolstoy",
"pg_id": 2600,
"pg_title": "War and Peace",
"pg_authors": [
"Tolstoy, Leo, graf"
],
"pg_languages": [
"en"
]
},
{
"rank": 6,
"title": "Anna Karenina",
"author": "Leo Tolstoy",
"pg_id": 1399,
"pg_title": "Anna Karenina",
"pg_authors": [
"Tolstoy, Leo, graf"
],
"pg_languages": [
"en"
]
},
{
"rank": 5,
"title": "In Search of Lost Time",
"author": "Marcel Proust",
"pg_id": null
},
{
"rank": 4,
"title": "To the Lighthouse",
"author": "Virginia Woolf",
"pg_id": null
},
{
"rank": 3,
"title": "Ulysses",
"author": "James Joyce",
"pg_id": 4300,
"pg_title": "Ulysses",
"pg_authors": [
"Joyce, James"
],
"pg_languages": [
"en"
]
},
{
"rank": 2,
"title": "Beloved",
"author": "Toni Morrison",
"pg_id": null
},
{
"rank": 1,
"title": "Middlemarch",
"author": "George Eliot",
"pg_id": 145,
"pg_title": "Middlemarch",
"pg_authors": [
"Eliot, George"
],
"pg_languages": [
"en"
]
}
]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment