こんな人に
崩れずに Markdown へ届く表
汎用の HTML から Markdown への変換ツールは、肝心な表で壊れます。セルの中にリスト、リンク、コード例がある表です。Clean Web Clipper は表を自分で書き出し、行を捨てる代わりにセルの中身を平らにします。
数字が消える場所
ページを保存した理由は表です。料金プラン、レート制限、保存期間、スキーマ。クリップをノートに貼ると、1 行が 1 ページに広がり、区切りの縦線は間違った位置にあり、ある列は黙って隣の列と混ざっています。数字は背後のブラウザの画面にまだ出ているので、失敗は見落としやすく、タブを閉じたときに初めて気づきます。
逆の失敗も同じだけ午後を奪います。いまだに多くのサイトが配置のためだけに table を使っており、そのすべてをデータとして扱う変換ツールは、データセットの顔をしたナビゲーション 20 行を渡してきます。一方は数字の打ち直しに、もう一方はグリッドの削除に時間を使い、どちらも座ったときにやるつもりだった分析ではありません。
打ち直しには、ずっとあとで表れる 3 つ目のコストがあります。手でシートに入力した数字には、出典も日付も確認の手段もありません。6 週間後、セル D14 の保存期間が 1 月にページから読んだものか 3 月に読んだものか誰も言えず、ページはその間に 2 回編集されています。料金、レート制限、割り当ては告知なしに変わります。出典の URL とページが示した日付を上に持つ取得した表なら、その問いに答えられ、次の四半期に同じページを取得して 2 つの差分を取れば、また答えられます。
崩れずに届くもの
- このために書いた GFM の表シリアライザー。 汎用の変換プラグインを後付けしたものではありません。
- 15 個中 12 個の表が残りました(技術系コーパス)。比較した各エンジンは 7 個でした。
- 不揃いな 2 列の表は、壊れたグリッドではなく、太字のキーと値の行になります。
- レイアウト用の表はほどきます。 配置のためだけのグリッドは、グリッドを外して中身だけを渡します。
- セルの中のコードはコードのまま、コードブロックの言語タグも保ちます。
- ページで表を選択して選択範囲をクリップできます。周りの記事がいらないときに。
- 出典の URL とページが示した日付が表の上にあるので、数字の組は、たまたま保存した日ではなく、それが有効だった日を持ちます。
- 同じページの 2 回目の取得には番号が付き、上書きされません。四半期ごとの差分が成り立つのはそのためです。
| Storage class | Meaning | | ------------- | ------------------------------------------------------ | | `NULL` | The value is a NULL value. | | `INTEGER` | A signed integer, stored in 1, 2, 3, 4, 6 or 8 bytes. | | `REAL` | A floating point value, stored as an 8-byte IEEE number.| | `TEXT` | A text string, stored using UTF-8, UTF-16BE or UTF-16LE.| | `BLOB` | A blob of data, stored exactly as it was input. |
表のための設定
設定 2 つと習慣 1 つです。その習慣、つまりクリップの前にスクロールすることが、どの設定よりも多くの行を取り戻します。
- 拡張機能のアイコンから オプション を開き、保存先を作業データのあるフォルダに向けます。それを使うノートブックやシートの隣の
data/sourcesです。 - アイコンをクリックしたときは ウィンドウを開く のままにします。表は保存する前に見る価値のある唯一のものです。列が揃っているかは一目で分かり、フォルダの一覧では分かりません。
- ファイル名のテンプレートを
{date}-{domain}-{title}にします。1 月と 4 月に取得した同じ料金ページが、隣り合って並ぶ 2 つのファイルになります。 - frontmatter で
sourceとdateをオンにします。取得元のアドレスがない表は、いずれ誰かが導き直さなければならない数字の組です。 - クリップする前に、表の一番下までスクロールします。スクロールで読み込まれる行は読み込まれるまで DOM に存在せず、拡張機能はクリップした瞬間の DOM を読みます。
- 周りの記事が関係ないときは、ページで表を選択し、選択範囲をクリップします。ウィンドウ上部の切り替えで、ページ全体ではなく選択範囲を見ていることを確認できます。
- 数字が動くページ(割り当て、料金、保存期間)について、カレンダーに定期的な取得の予定を入れます。コーパスの価値は 1 回目ではなく 2 回目の取得にあります。
使い回す数字のための設定
下のどの値にも共通する目的は、半年後に読む表が、どこから来ていつのものかを今でも語れることです。
| 設定 | 値 | ここでこの値にする理由 |
|---|---|---|
| アイコンをクリックしたとき | ウィンドウを開く | ずれた列は見れば明らかで、ファイルの一覧では見えない |
| 保存先 | フォルダ `data/sources` | 取得したものを、それを使うノートブックやシートの隣に置ける |
| ファイル名のテンプレート | `{date}-{domain}-{title}` | 1 つのページの四半期ごとの取得がまとまって並び、重ならない |
| frontmatter | `source` と `date` をオン | 数字の組を、引用できる事実に戻す 2 行 |
| 画像 | 含めない | グラフはどのみち画像のリンクとして届く。拡張機能は画像から数字を読まない |
| 選択範囲 | 表を選択し、選択範囲をクリップ | 4 行の表の周りの 12 画面分の記事は、データフォルダではノイズ |
| 繰り返しの取得 | 四半期ごとに同じページをクリップ | 番号が付くので両方が残り、差分こそが分析になる |
**Content-Type** : The media type of the resource. Required on every request with a body. **Cache-Control** : Directives for caching mechanisms in both requests and responses. **Retry-After** : Either a delay in seconds or an HTTP-date after which to retry. 元のグリッドには結合された見出しセルがあり、最後の行には入れ子のリストがありました。 Markdown の表として再現すれば崩れていましたが、ペアにすれば崩れません。
3 つの表、3 つの結果
料金表を比較シートへ
4 社の、4 つの料金ページ、4 回の取得。どの表も GFM の表として、プラン名、金額、制限がもとのセルに入ったまま、上に出典の URL を持って届くので、比較シートは数字を 1 つも打ち直さずに組み立てられます。
シリアライザーが真価を発揮するのはここです。汎用の変換ツールを壊すのは、脚注の記号、含まれる機能のリスト、コード例が中にあるセルです。15 個の表からなる技術系コーパスでは、比較した各エンジンの 7 個に対して、ここでは 12 個の表が残りました。
四半期をあけた同じページ
あるプロバイダーのレート制限を 2 月と 5 月に取得しました。2 つ目のファイルには番号が付きました。差分を見ると、スタータープランのバースト許容量が半分になり、最上位プランの保存期間が延びています。どちらもどこにも告知されていませんでした。
2 月のファイルがなければ、変更は証明できません。ページは現在の状態しか見せず、以前の数字は提供元が公開するどこにも存在しないからです。この方法は、重要だと分かる前に取っておけるほど、1 回目の取得が安くなければ成り立ちません。
表にはなりえなかったグリッド
仕様書のページが、結合された見出しセルと、ある行に入れ子のリストを持つ 2 列のグリッドで 20 個のヘッダーを定義しています。Markdown の表として再現すれば崩れていましたが、代わりに太字のキーの行とその下の値として届き、読むにも検索するにも損失がありません。
この動作は失敗したときの代替手段ではなく、意図したものです。不揃いな 2 列の表は、データであるより、グリッドをまとった定義リストであることがはるかに多く、壊れた縦線の表はリストを読むより直すほうが大変です。
表を移すよくある方法との比較
どれもページから数字を取り出せます。違うのは、数字と一緒に何が届き、そのあと何をしなければならないかです。
| 今のやり方 | 得られるもの | コスト |
|---|---|---|
| シートに打ち直す | 必要なセルそのもの | 転記ミスがあり、出典や日付の記録もない |
| スプレッドシートにコピー&ペースト | ときにはグリッドがそのまま | リストやコードのあるセルで失敗し、レイアウト用のグリッドがデータとして届く |
| 表のスクリーンショット | 表示されたとおりの表 | 計算できず、検索できず、出典の行もない |
| サイト自身の CSV エクスポート | あればきれいなデータ | ほとんどのページにはなく、表示と中身が違うこともある |
| 汎用の HTML から Markdown への変換ツール | すばやく Markdown | リストやコードブロックのあるセルが、汎用の変換ツールの壊れる場所 |
| Clean Web Clipper | 出典と日付を上に持つ GFM の表 | 結合セルなし、CSV エクスポートなし、グラフの画像からの数字の読み取りなし |
表がうまく出てこないとき
結合セルが消えた
Markdown には結合セルがないので、colspan と rowspan は平らにします。中身は残りますが、見た目の結合は形式が表せないので残りません。3 列にまたがっていた結合見出しは、そのうち最初の列にテキストが入ります。これは変換ではなく出力先の形式の性質で、どこの Markdown の表もそれを表せません。
行の半分がない
拡張機能はクリップした瞬間の DOM を読むので、スクロールで読み込まれる行(あるいは「もっと見る」ボタンで出てくる行、ページ分けされた行)は、自分でそうさせない限りまだ存在しません。一番下までスクロールし、展開できるものは展開してからクリップしてください。ページ分けされた表は各ページをクリップします。部分はあとでつなげられ、ブラウザが受け取らなかった行を取り戻す方法はほかにありません。
データではなくナビゲーションのグリッドが届いた
それはレイアウト用の表です。配置のためだけに使われるグリッドで、古いサイトの多くはメニューやヘッダーにまだ使っています。そうした表は変換せずにほどくので、中身はグリッドなしで届きます。ナビゲーションのグリッドが表としてノートに入ったなら、ページがそれをデータの表としてマークアップしていたからです。マークアップが「データ」と言い、拡張機能はそれを信じました。
表がキーと値の行になった
それは不揃いな 2 列の経路です。行の揃わない 2 列の表はたいていグリッドとして描かれた定義リストで、縦線の表として再現すると読めるグリッドではなく壊れたグリッドになります。中身は完全です。太字のキー、その下の値が、もとの順番で並びます。本当の表として必要なら、ペアは機械的に表に戻せます。
形式の限界
Markdown には結合セルがないので、colspan と rowspan は平らにします。中身は残りますが、見た目の結合は形式が表せないので残りません。セルの中に入れ子になった表はどの道具にも難しく、これも例外ではありません。グラフの画像から数字を読み取ることはせず、CSV や XLSX も書き出しません。出力は Markdown です。そして 1 回に 1 ページ、開いているページを変換します。
よくある質問
配置のためだけの表はどうなりますか?
結合セルに対応していますか?
表だけをクリップできますか?
CSV として取り出せますか?
スクロールで行が増えていく表はどうですか?
グラフから数字を読み取りますか?
数字がいつ有効だったかはファイルに残りますか?
{date} でファイル名に入れられます。ページが日付を示していなければ、欄は埋めずに空のままにします。少なくとも、間違った数字ではなく正直な空白です。