アウトプット記録

いろんなことをアウトプットします

エクスポートしたはてなブックマークのフィードをCSVファイルに変換する

はじめに

はてなブックマークにおいて、特定の1年にブックマークした自分のブックマークを確認したかったのですが、マイページからはわかりにくかったため、Pythonの練習がてらブックマーク一覧をCSV形式に変換しました。

はてなブックマークの [マイページ > 設定 > データ管理] からブックマークのデータがエクスポートできます。出力可能な形式は

の3パターンです。中身を見てみたところ、Atomフィード形式が扱いやすそうだったので、そちらを利用することにしました。

入力データ

はてなブックマークからエクスポートできるAtomフィード形式のファイルは以下の形式です。どうやらxml形式として扱えそうです。(値は適宜置き換えています)

<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
  <title>(はてなID)のブックマーク</title>
  <link type="text/html" rel="alternate" href="https://b.hatena.ne.jp/(はてなID)/bookmark"/>
  <link type="application/x.atom+xml" rel="service.post" title="(はてなID)のブックマーク" href="https://b.hatena.ne.jp/atom/post"/>
  <entry>
    <id>tag:hatena.ne.jp,2005:bookmark-(はてなID)-(数字列)</id>
    <title>(ページタイトル)</title>
    <link type="text/html" rel="related" href="(ページURL)"/>
    <link type="text/html" rel="alternate" href="(ブックマークURL)"/>
    <link type="application/x.atom+xml" rel="service.edit" title="(ページタイトル)" href="https://b.hatena.ne.jp/atom/edit/(数字列)"/>
    <summary>(コメント)</summary>
    <issued>(日時)</issued>
    <author>
      <name>(はてなID)</name>
    </author>
    <dc:subject>(タグ1)</dc:subject>
    <dc:subject>(タグ2)</dc:subject>
  </entry>
  <entry>
    ...
  </entry>
  ...
</feed>

方針

日付でブックマークをフィルタして確認することが目標です。出力結果には以下のものが含まれることにしました。

  • 通し番号
  • ブックマークしたページタイトル
  • ページのURL
  • 自分のコメント
  • ブックマークした日時
  • タグ

作成したコード

import bs4
import csv
from datetime import datetime


soup = bs4.BeautifulSoup(open('(bookmarks.atom)'), 'xml')
entry_list = []

header = ['index', 'title', 'URL', 'comment', 'time', 'tags']
entry_list.append(header)

entries = soup.find_all('entry')

for idx, entry in enumerate(entries):
    data = []
    index = str(idx)
    title = entry.find('title').text
    link = entry.find('link').get('href')
    summary = entry.find('summary').text
    issued = entry.find('issued').text

    time = datetime.strptime(issued, '%Y-%m-%dT%H:%M:%S%z')
    time = "{0:%Y-%m-%d %H:%M:%S}".format(time)

    tags = entry.find_all('dc:subject')
    tag_list = []
    for tag in tags:
        tag_list.append(tag.text)
    tag_data = ','.join(tag_list)

    data.append(index)
    data.append(title)
    data.append(link)
    data.append(summary)
    data.append(time)
    data.append(tag_data)

    entry_list.append(data)

with open('data.csv', 'w', encoding="utf_8_sig") as file:
    writer = csv.writer(file, lineterminator='\n')
    writer.writerows(entry_list)

出力結果

以下の出力結果が得られます。

index,title,URL,comment,time,tags
0,(ページタイトル),(ページURL),(コメント),(日時),"(タグ1),(タグ2)"
1,...
...

自分が欲しい情報のみを出力しているので、コードを変更すれば他の値も出力可能です。

感想

これまでコードを書いてこなかったので、意図する動きをするプログラムが書けて良かったです。 本当はもう少し解説?してqiitaに投稿しようと思っていましたが、力尽きたのでひとまずここで供養することにします。