読者です 読者をやめる 読者になる 読者になる

はてなブログの見出しとMarkdownモード、そしてスクレイピング

雑記 プログラミング はてな スクレイビング

今更ではあるけれど……。 (はてなダイアリーとの互換性だかなんか知らないけど、)はてなブログでは<h2>タグは使わない前提になってるらしい。

なんの話かというと、現状このブログの記事のほとんどは見出しに<h1>タグを使っているエントリが複数ある状態で色々と好ましくないということです。

はてなブログには「はてな記法」「Markdown」「見たまま」の三つの編集モードがあり、そしてこのブログはMarkdownモードで書いています。

一般的なMarkdownの記法では、見出しは#の後ろに一つ以上の半角記号が続く独立した行で、#の数で見出しの階層を表現します。

# 見出し1

## 見出し2

### 見出し3

上記の例で言うと最初の「見出し1」の部分は<h1>タグに、2つ目の「見出し2」は<h2>タグになる。

ほとんどのブログテーマはh2タグの見た目を規定してないか、使わない前提でデザインしているように見える。何も考えずに、見出しとして# ...という書式で記事を書くと、テーマによっては見出しの見た目がイマイチになってしまう。

編集ページのメニューから見出しを入力しようとすると、### ...となるので、 システム側としては###、つまり<h3>タグを使わせたい模様。 少なくとも一般的なはてなブログのテーマを使う限り、見出しは###にしたほうが見た目が自然になる。

参考:はてなブログをMarkdownで書く際には,見出しはh3要素からはじめる - 白覧境幾

ところがこれをやるとHTML5としては<h1>の次に<h2>を飛ばして<h3>になるのでHTMLとしては不自然になる。一説によるとSEOの面から不利かもしれないとのこと。

Markdownモードの方はお気をつけください、ということです。

<h1>タグは記事のタイトル用ということでさすがにまずいので意図せずに<h1>タグになっている箇所だけ<h2>になるように記事を修正したい。


以前から実は気づいていましたが、そもそもこのブログ、文体が「ですます体」だったり「だ・である体」だったり非常に読みにくい。……できればそっちもなんとかしたい。

修正対象ページをリストアップする

というわけでまずは対象ページをリストアップ。

APIで全ページ取り出す方法もあるみたいだけど…。

ブログのURLの末尾に/archiveをつけると全ページの一覧(ただしページネーションあり)が取得できるようです。ただ、ページネーションのリンクをたどるの少々面倒なので、月別アーカイブから取り出す方向で。

はてなブログでは"http://ブログURL/archives/年/月"という形式でその月の記事が(ページネーションなしで)取り出せるようなのでこれを使います。。

準備

Rubyで適当なスクリプトを作る。Ruby については複数バージョンのRubyを共存させるためにrbenvを使ってインストールしている。Ruby 2.3.1を使うものとし、HTMLおよびXMLのパースようのライブラリとしてNokogiriもインストールする。rbenv local 2.3.1というのはこのディレクトリ以下では2.3.1という名称でインストールされているRubyインタプリタ*1を使うように設定するよ、というrbenvのコマンド。2.3.1の部分を使用したいインストール済みのRubyインタプリタを指定。

$ rbenv install 2.3.1
$ rbenv local 2.3.1
$ rbenv exec gem install nokogiri

やっつけ作業用のスクリプト

以下のように動作するやっつけ作業用のスクリプトを作成します。

  1. 月別アーカイブのURLを適当に生成(2015/01-2016/12)
  2. ブログ開始から今月までの記事を対象にするので、対象となる記事が存在しない月のURLを捨てる
  3. それぞれの月の記事一覧ページのHTMLから各ブログ記事のURLをNokogiriで取り出す
  4. それぞれの記事の本文のHTMLを取得し、不適切な<h1>タグを含むページを探す

やっつけURL一覧取得スクリプトRuby)。

対象のはてなブログの各エントリにおいて、見出しにh1タグが使われているURLを見つけ出すやっつけ作業 ...

あとは出力されたURLにアクセスして、個別に修正する作業を繰り返すことになります。 同じ要領で「だ・である体」のエントリも検出することもできるけど後回し。


幸か不幸か、リストアップされた修正が必要なエントリは合計39エントリ……。

パトラッシュ…、(やる前から)僕もう疲れたよ?


修正作業はこれからですが以上です。

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

*1:ランタイムというべきなのか実行エンジンというべきなのか?