この一ヶ月ほど、読書尚友の改良を重点的に行っている。最近の改良点は:
- 児童書の分野別検索(NDC)
- 書籍一覧に書き出しを表示
- 作家別リストに著者画像を表示(Wikipediaより)
- 次・前の検索語のボタン
- 本文に時刻表示
今回の改良の中で、特筆すべきなのは、書き出しと著者画像だと思う。どちらも、PythonでWebスクレイピングを行って情報を取得している。Pythonは初めて使ってみたが、使いやすい。結構古くからある言語なので、EBシリーズ関連のスクリプトもRubyではなくPythonを採用しておけばよかったかもしれない。
書き出しの表示
書店で書籍を選ぶとき、目次と書き出しを見て、まず読むに値するかどうかを決めると思う。書籍一覧に書き出しまで表示すると情報過多な気もするが、意外に便利だ。もちろん、設定で書き出しをオフにすることもできる。
書き出しの例
書き出しは、青空文庫の図書カードのHTMLのMETA要素に含まれている。例えば「坊ちゃん」の図書カードのヘッダは次のようになっている。ここから、 property="og:description"の要素を取り出す。
<html lang="ja" xmlns:og="http://ogp.me/ns#"> <head> <meta charset="utf-8"> <meta property="og:type" content="book"> <meta property="og:url" content="https://www.aozora.gr.jp/cards/000148/card752.html"> <meta property="og:image" content="https://www.aozora.gr.jp/images/top_logo_300x300.png"> <meta property="og:image:type" content="image/png"> <meta property="og:title" content="坊っちゃん (夏目 漱石)"> <meta property="og:description" content="一 親譲(おやゆず)りの無鉄砲(むてっぽう)で小供の時から損ばかりしている。小学校に居る時分学校の二階から飛び降りて一週間ほど腰(こし)を抜(ぬ)かした事がある。なぜそんな無闇(むやみ)をしたと聞く人…"> <!-- OGP: thanks to @cc4966 https://github.com/aozorahack/ogp --> <meta name="twitter:card" content="summary" /> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>図書カード:坊っちゃん</title>
Pythonで書き出しを取得するスクリプトは次のようになる。requestsとBeautifulSoupを使用する。
import requests from bs4 import BeautifulSoup url = "https://www.aozora.gr.jp/cards/000148/card752.html" card = requests.get( url ) soup = BeautifulSoup( card.content, "html.parser") meta = soup.select_one('meta[property="og:description"]') with open( "kakidasi.txt" ,"w") as file: file.write( meta['content'])
著者画像の表示
著者画像もあると興味が湧いて、覗いてみたくなったりする。著者画像は、著作権の関係もあるので、全てWikipediaから取得している。
著者画像の例
著者画像を取得するスクリプトの例を示す。青空文庫の夏目漱石の著者カード(person148.html")からWikipediaへのリンクを探し、続いてWikipwdiaから著者画像を取得している。
import requests from bs4 import BeautifulSoup # 著者ページを取得 person_url = "https://www.aozora.gr.jp/index_pages/person148.html" card = requests.get( person_url ) soup0 = BeautifulSoup( card.content, "html.parser") # wikipedia のリンクを取得 links = [url.get('href') for url in soup0.find_all('a')] for link in links : if not link : continue if link.find("wikipedia.org/wiki/") >0 : # 著者画像を取得 response = requests. get( link) soup = BeautifulSoup( response.content, "html.parser") meta = soup.select_one('meta[property="og:image"]') if not meta : continue image_url = meta['content'] image_data = requests.get( image_url) with open( "148.jpg","wb") as file: file.write( image_data. content) break
将来構想?
あと実現したいとすれば、端末を横にしたときの段組表示である。スマートフォンだとあまり必要性を感じなかったが、Windows10の検証用に中華タブレット(iPlay40)を買ったところ、横組みの時は段組が必須だと思うようになった。