前回はてなフォトライフへの、画像のアップロードを行いました。
ローカル環境で記事を書くとき、必要なのは画像のURL情報です……
ということで今回は、アップロードした画像のURLを取得する方法です!
フォトライフから取得できるXML
前回記事で、はてなフォトライフにアップロードしたときに、取得したXMLがコチラ。
<?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://purl.org/atom/ns#" xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#"> <title>Sample</title> <link rel="alternate" type="text/html" href="http://f.hatena.ne.jp/liszworks/20190530134425"/> <link rel="service.edit" type="application/x.atom+xml" href="http://f.hatena.ne.jp/atom/edit/20190530134425" title="Sample"/> <issued>2019-05-30T13:44:25+09:00</issued> <author> <name>liszworks</name> </author> <generator url="http://f.hatena.ne.jp/" version="1.0">Hatena::Fotolife</generator> <dc:subject xmlns:dc="http://purl.org/dc/elements/1.1/">tmp</dc:subject> <id>tag:hatena.ne.jp,2005:fotolife-liszworks-20190530134425</id> <hatena:imageurl>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425.png</hatena:imageurl> <hatena:imageurlmedium>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425_120.jpg</hatena:imageurlmedium> <hatena:imageurlsmall>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425_m.jpg</hatena:imageurlsmall> <hatena:syntax>f:id:liszworks:20190530134425p:image</hatena:syntax> </entry
このうち、画像のURLがコチラ。
<hatena:imageurl>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425.png</hatena:imageurl>
コチラの2つも画像のURLですが、はてなフォトライフが自動で作成した、縮小版画像のURLのようです。
<hatena:imageurlmedium>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425_120.jpg</hatena:imageurlmedium> <hatena:imageurlsmall>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425_m.jpg</hatena:imageurlsmall>
ということで、
<hatena:imageurl>
を取得すれば、アップロードした画像のURLがわかりますね!
PythonでXMLを解析
PythonでXMLを解析するには、「xml.etree.ElementTree」というものを使うようです。
ぼくの環境では、pip installせずに使えました。
サクッとググった感じでは、pip installとかいらないようです。
このようにimportします。
import xml.etree.ElementTree as ET
作成した処理はコチラ。
import xml.etree.ElementTree as ET def getImageUrl(xml) root = ET.fromstring(xml) imageUrl = None for child in root: if child.tag == '{http://www.hatena.ne.jp/info/xmlns#}imageurl': print(child.tag + '> ' + child.text) imageUrl = child.text break return imageUrl
解説
それでは要所要所、解説していきます。
XMLのルート位置の取得
ElementTreeを使うには、まずroot位置を取得します。
root = ET.fromstring(text)
これで
<?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://purl.org/atom/ns#" xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#"> <title>Sample</title> (中略) </entry
の2行目、「entryタグ」の要素を取得できます。
XMLの小要素を検索
XMLの要素を取得したら、小要素を取得していきます。
<?xml version="1.0" encoding="utf-8"?> <entry xmlns="http://purl.org/atom/ns#" xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#"> <title>Sample</title> (中略) </entry
でいうところの、「titleタグ」など、entryタグの中に入っている要素たちですね。
例えば
for child in root: print(child.tag)
のようにすると、rootの小要素分ループを回し、小要素のタグを出力していくことができます。
XMLから画像URLが入ったタグをサーチ
さてここが本題ですね。
この「画像URLの入ったタグ」をサーチします。
<hatena:imageurl>https://cdn-ak.f.st-hatena.com/images/fotolife/l/liszworks/20190530/20190530134425.png</hatena:imageurl>
前述の通り、小要素をサーチしていけば、たどり着くことができます。
しかし
for child in root: if child.tag == 'hatena:imageurl': print('みつけた!')
とすると、見つかりません。
「は?」って感じですね。
最初に記載しているソースの通り、正解はこのように書く必要があります。
for child in root: if child.tag == '{http://www.hatena.ne.jp/info/xmlns#}imageurl': print('みつけた!')
「'{http://www.hatena.ne.jp/info/xmlns#}imageurl'ってなんだよ!」
って感じですが、コレはXMLの仕様で、設定していると付加される文字列が付いた状態のようです。
entryタグの属性に「xmlns」というものが付いています。
<entry xmlns="http://purl.org/atom/ns#" xmlns:hatena="http://www.hatena.ne.jp/info/xmlns#">
ググったらこのように書かれていました。
xmlns属性 XHTML(というよりXML)では、1つの文書の中でXHTMLをはじめ、他に定義されたマークアップ言語を複数使用することができます。 ... XHTML文書を作成する場合は、通常、このxmlns属性をに記述しておき、値に「http://www.w3.org/TR/xhtml1」を記述します。
http://w-d-l.net/htmltipsxmlns/
なんだかコレを書くと、設定した値を付加するみたいですね。
で、実際小要素のタグを表示させてみると
{http://www.hatena.ne.jp/info/xmlns#}imageurl
と表示されます。
なのでコレで一致を見ればOKですね。
はてなフォトライフ側の仕様が変わって、xmlns属性の値が変わるとしたら、この単純なロジックでは書き換えが必要となってしまいますが……
基本的には大丈夫でしょう。
参考
コチラを参考にしました。ありがとうございました!
[http://w-d-l.net/htmltipsxmlns/:embed:cite]
あとがき
はてなフォトライフへアップロードした画像のURLを取得する方法でした!
なんだか記事作成が捗りそうな予感がしますね!
(なんで今まで作ろうとしなかったんだろう……)
みなさんも良ければ参考にしてみてくださいー!
「そもそも、はてなフォトライフにアップロードする方法は?」
という記事はコチラ!