lisz-works

プログラミングと興味を貴方に

Python3→はてなフォトライフへアップした画像URLを取得する(コピペでOK)

【スポンサーリンク】

Python

前回はてなフォトライフへの、画像のアップロードを行いました。

www.lisz-works.com

ローカル環境で記事を書くとき、必要なのは画像の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属性の値が変わるとしたら、この単純なロジックでは書き換えが必要となってしまいますが……

基本的には大丈夫でしょう。

参考

コチラを参考にしました。ありがとうございました!

maku77.github.io

[http://w-d-l.net/htmltipsxmlns/:embed:cite]

あとがき

はてなフォトライフへアップロードした画像のURLを取得する方法でした!

なんだか記事作成が捗りそうな予感がしますね!

(なんで今まで作ろうとしなかったんだろう……)

みなさんも良ければ参考にしてみてくださいー!

「そもそも、はてなフォトライフにアップロードする方法は?」

という記事はコチラ!