エクスポートしたはてなブックマークのフィードをCSVファイルに変換する
はじめに
はてなブックマークにおいて、特定の1年にブックマークした自分のブックマークを確認したかったのですが、マイページからはわかりにくかったため、Pythonの練習がてらブックマーク一覧をCSV形式に変換しました。
はてなブックマークの [マイページ > 設定 > データ管理] からブックマークのデータがエクスポートできます。出力可能な形式は
- ブックマーク形式
- Atomフィード形式
- RSS1.0形式
の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に投稿しようと思っていましたが、力尽きたのでひとまずここで供養することにします。