LoginSignup
0
1

More than 3 years have passed since last update.

日々の進捗ノート_言語処理100本ノックまとめ

Last updated at Posted at 2019-06-28

記事がひとつにまとまってた方がいいと言われたのでそうします
これからはここに更新していく形にします

はんたまです.
大学時代は化学専攻なのに,理系出身というだけでプログラミングをやる部署に異動になりました.
素人ながらヒイコラ環境は作ったので,勉強と気分転換のために自然言語処理100本ノックをやろうと思います.
ただやるのもなんなので,気づいたこととかのメモ書きにQiita始めました.

言語処理100本ノック 2015

Udemyで入門コースを2時間ぐらい見ただけのド素人状態からの挑戦です.
最後まで終わる頃には,初心者に毛が生えたくらいにはなってくれていたらいいなと思います.

目次

00. 文字列の逆順
01. 「パタトクカシーー」
02. 「パトカー」+「タクシー」=「パタトクカシーー」
03. 円周率
04. 元素記号
05. n-gram
06. 集合
07. テンプレートによる文生成
08. 暗号文
09. Typoglycemia
10. 行数のカウント
11. タブをスペースに置換
12. 1列目をcol1.txtに,2列目をcol2.txtに保存
13. col1.txtとcol2.txtをマージ
14. 先頭からN行を出力
15. 末尾のN行を出力
16. ファイルをN分割する
17. 1列目の文字列の異なり
18. 各行を3コラム目の数値の降順にソート
19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる
20. JSONデータの読み込み
21. カテゴリ名を含む行を抽出
22. カテゴリ名の抽出
23. セクション構造
24. ファイル参照の抽出
25. テンプレートの抽出
26. 強調マークアップの除去
27. 内部リンクの除去
28. MediaWikiマークアップの除去
29. 国旗画像のURLを取得する

第1章: 準備運動

00.文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

gen00.py
s = "stressed"
print(s[::-1])

結果

desserts

備忘録

・文字列はそのままでもリストみたいに操作できる
・stressedは逆から読むとdesserts

01.「パタトクカシーー」

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

gengo01.py
p = "パタトクカシーー"
print(p[0::2])

結果

パトカー

備忘録

・パタトクカシーーなんて言葉はない

02.「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

gengo02.py
pat = "パトカー"
tax = "タクシー"
res = ""
for (i, j) in zip(pat, tax):
    res += i + j
print(res)

結果

パタトクカシーー

備忘録

・zapじゃなくてzip

03.円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

gengo03.py
sen = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
sen = sen.replace(",", "")
sen = sen.replace(".", "")
sp = sen.split(" ")
res = []
for i in sp:
    res.append(len(i))
print(res)

結果

[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

備忘録

・replaceじゃない記述法がある気がする
・分割するときはsplit
・forでリストに格納していくときは予め空のリストを宣言しておく
→appendとかのメソッドを使うためにはもととなるものがないとダメ
・円周率はだいたい3

04.元素記号

"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

190628追記

for x, i in enumerate (senlis, 1)
ここんとこiを前にしてxを後にしたほうがいいらしい
確かにiは慣例としてインデックス値を取る
あと関数は省略しないほうがいい,とのことでxをcharacterにするとかするとよりよい.

gengo04.py
sen = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
sen = sen.replace(".", "")
senlis = sen.split(" ")
pick =(1, 5, 6, 7, 8, 9, 15, 16, 19)
res = {}
for x, i in enumerate(senlis, 1):
    if x in pick:
        res[senlis[x - 1][0]] = x
    else:
        res[senlis[x - 1][0:2]] = x

print(res)

結果

{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}

備忘録

・enumerateべんり
・12番目の元素はMg

05.n-gram

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

gengo05.py
def l_n_gram(sentence, n):
    res = []
    for i in range(len(sentence)-n+1):
        res.append(sentence[i : i+n])
    return(res)

def w_n_gram(sentence, n):
    sentence = sentence.split(" ")
    return(l_n_gram(sentence, n))

print(l_n_gram("I am an NLPer", 2))
print(w_n_gram("I am an NLPer", 2))

結果

['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]

備忘録

・関数名にはハイフンは使えない
・":"忘れがち

06.集合

"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.

gengo06.py
def l_n_gram(sentence, n):
    res = set()
    for i in range(len(sentence)-n+1):
        res.add(sentence[i : i+n])
    return(res)

x = l_n_gram("paraparaparadise", 2)
y = l_n_gram("paragraph", 2)
print("和", x | y, 
"積", x & y,
"差", x - y,
"xにse存在", "se" in x,
"yにse存在", "se" in y,
sep="\n")

結果


{'gr', 'di', 'se', 'ag', 'ar', 'ra', 'ap', 'pa', 'ad', 'is', 'ph'}

{'pa', 'ap', 'ra', 'ar'}

{'is', 'di', 'se', 'ad'}
xにse存在
True
yにse存在
False

備忘録

・{}だと辞書型になっちゃう

07. テンプレートによる文生成

引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ.

190628追記

・tempはtemporaryの意味に見えるから使っちゃダメらしい

gengo07.py
def temp(x, y, z):
    return(str(x) + "時の" + str(y) + "は" + str(z))

def temp2(x, y, z):
    return("{a}時の{b}は{c}".format(a=x, b=y, c=z))

def temp3(x, y, z):
    return(f"{x}時の{y}{z}")

print(temp(12, "気温", 22.4))
print(temp2(12, "気温", 22.4))
print(temp3(12, "気温", 22.4))

結果

12時の気温は22.4
12時の気温は22.4
12時の気温は22.4

備忘録

・f-stringsがつよい
・今日の12時の気温は29度

08.暗号文

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.
・英小文字ならば(219 - 文字コード)の文字に置換
・その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.

gengo08.py
def cipher(word):
    result = list(word)
    for x, i in enumerate(word):
        if i.islower():
            result[x] = chr(219 - ord(i))

    return "".join(result)

getword = input("文字列を入力")
encoded = cipher(getword)
print(encoded)
decoded = cipher(encoded)
print(decoded)

結果

文字列を入力Do you hear the people's sing?
Dl blf svzi gsv kvlkov'h hrmt?
Do you hear the people's sing?

備忘録

・絶対もっと簡単にかけると思う
・islowerは()でちゃんと実行しないとダメ
・関数名は省略しないほうがいい,と言われたのでそうしてみることにする
・こっちのほうがいいかも

gengo08re.py
def cipher(word):
    for i in word:
        if i.islower():
            word = word.replace(i , chr(219 - ord(i)))
    return word

getword = input("文字列を入力")
encoded = cipher(getword)
print(encoded)
decoded = cipher(encoded)
print(decoded)

09.Typoglycemia

スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.

gengo09.py
import random
def shuffle_doumei_ken(sentence):
    word_list = sentence.split(" ")
    result = ""
    for i in word_list:
        if len(i) > 4:
            firstchr = i[0]
            centerchr = "".join(random.sample(i[1:-1],len(i)-2))
            lastchr = i[-1]
            result = result + " " + firstchr + centerchr + lastchr
        else:
            result = result + " " + i
    result = result[1:]
    return result

sentence = input("文章を入力してください") 
print (shuffle_doumei_ken(sentence))

結果

文章を入力してくださいI couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .
I cul'odnt bilevee that I cluod alltacuy uredtnsnad what I was rndaeig : the penoehnmal power of the haumn mind .

備忘録

・random.shuffle()は入れたオブジェクトそのものに対する操作なので,変更不可である文字列には使えない.

第2章: UNIXコマンドの基礎

hightemp.txtは,日本の最高気温の記録を「都道府県」「地点」「℃」「日」のタブ区切り形式で格納したファイルである.以下の処理を行うプログラムを作成し,hightemp.txtを入力ファイルとして実行せよ.さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

10.行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

190701追記

readlinesの”s”(複数形)はリストを返すことを暗に示している。
したがって、それを受け取る変数も複数形にするとリストであることを強調できていい――とのこと。なるほど!

gengo10.py
with open("hightemp.txt", "r") as f:
    textfile = f.readlines()
    print(len(textfile))

結果

24

ターミナルで確認

wc hightemp.txt
      24      98     813 hightemp.txt

備忘録

・readlines()は各行が入ったリストを返す
・pandasというのが便利らしいが今回は勉強のため使わない

11.タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

gengo11.py
with open("hightemp.txt", "r") as before, open("hightemp_after.txt", "w+") as after:
    for line in before:
        after.write(line.replace("\t", " "))
    after.seek(0)
    print(after.read())

結果

高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

ターミナルで確認

sed s/$'\t'/' '/g hightemp.txt
以下略

備忘録

・練習のため新たにファイルを作ってみた
・forは.readlines()を入れなくても回せる←入れないほうがいい
・書き込んだ後は最後の文字に行っているのでseekで最初に戻ってから書き出す

12.1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

190701追記

ファイルへの入出力が都度発生すると処理に時間がかかるから
①書き出したい行をリストとして保持して
②改行を区切り文字として結合して
③ファイルに書き出す
f.write(‘¥n’.join(hoge_list))
とすると良さそう・・・とのこと.処理速度のことも頑張って意識したい!

gengo12.py
with open("hightemp.txt", "r") as f,\
open("col1.txt", "w+") as c1,\
open("col2.txt", "w+") as c2:
    for line in f:
        linewords = line.split("\t")
        c1.write(linewords[0])
        c1.write("\n")
        c2.write(linewords[1])
        c2.write("\n")
    c1.seek(0)
    c2.seek(0)
    print("col1 \n", c1.read(), sep="")
    print("col2 \n", c2.read(), sep="")

結果

col1
高知県
埼玉県
岐阜県
山形県
山梨県
和歌山県
静岡県
山梨県
埼玉県
群馬県
群馬県
愛知県
千葉県
静岡県
愛媛県
山形県
岐阜県
群馬県
千葉県
埼玉県
大阪府
山梨県
山形県
愛知県

col2
江川崎
熊谷
多治見
山形
甲府
かつらぎ
天竜
勝沼
越谷
館林
上里見
愛西
牛久
佐久間
宇和島
酒田
美濃
前橋
茂原
鳩山
豊中
大月
鶴岡
名古屋

ターミナルで確認

cut -f 1 hightemp.txt
以下略

備忘録

・writeしたあと改行するのってこう書くしかないんだろうか?

13.col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

190701追記

replace("\n","")って書いてたの,末尾のみの置換だからstrip("\n")に置き換えられるとの知見を得た.こっちのほうがスッキリ!

190701再追記

改行も空白文字扱いなので"/n"も省けるよう.

空白文字は、Unicode 文字データベースで "Other" または "Separator" と定義されていて、双方向プロパティが "WS"、 "B"、 "S" のいずれかである文字です。
ということで、スペース、改行、タブどれも空白文字扱い

gengo13.py
with open("merged.txt", "w+") as f,\
open("col1.txt", "r") as c1,\
open("col2.txt", "r") as c2:
    flines = [word1.replace("\n","")+"\t"+word2.replace("\n","")+"\n"\
                for word1, word2 in zip(c1.readlines(), c2.readlines())]
    f.writelines(flines)
    f.seek(0)
    print(f.read())

結果

高知県 江川崎
埼玉県 熊谷
岐阜県 多治見
山形県 山形
山梨県 甲府
和歌山県 かつらぎ
静岡県 天竜
山梨県 勝沼
埼玉県 越谷
群馬県 館林
群馬県 上里見
愛知県 愛西
千葉県 牛久
静岡県 佐久間
愛媛県 宇和島
山形県 酒田
岐阜県 美濃
群馬県 前橋
千葉県 茂原
埼玉県 鳩山
大阪府 豊中
山梨県 大月
山形県 鶴岡
愛知県 名古屋

ターミナルで確認

paste col1.txt col2.txt
以下略

備忘録

・リスト内包表記を使えるかどうか意識してちゃんと使ってみたい

14.先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

gengo14.py
import sys
args = sys.argv

max_line = int(args[1])

with open("hightemp.txt", "r") as f:
    for _ in range(max_line):
        line = f.readline()
        print(line, end="")

結果

python gengo14.py 5
高知県   江川崎   41  2013-08-12
埼玉県   熊谷  40.9    2007-08-16
岐阜県   多治見   40.9    2007-08-16
山形県   山形  40.8    1933-07-25
山梨県   甲府  40.7    2013-08-10

ターミナルで確認

head -n 5 hightemp.txt
以下略

備忘録

・改行の扱いに注意 writeとreadでデフォルト改行ありなしの違いに意識すること
・0は自然数

15.末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

190701追記

最後の行、print(lines[-max_line+i].replace("\n", ""))でいけるとのこと(確かに).heightを使う必要はなかった・・・!

190701再追記

そもそも
for line in lines[-N:]
print(line)
でいけるらしい.確かに・・・.

gengo15.py
import sys
args = sys.argv

max_line = int(args[1])

with open("hightemp.txt", "r") as f:
    lines = f.readlines()
    height = len(lines)
    for i in range(max_line):
        print(lines[height-max_line+i].replace("\n", ""))

結果

python gengo15.py 5
埼玉県   鳩山  39.9    1997-07-05
大阪府   豊中  39.9    1994-08-08
山梨県   大月  39.9    1990-07-19
山形県   鶴岡  39.9    1978-08-03
愛知県   名古屋   39.9    1942-08-02

ターミナルで確認

tail -n 5 hightemp.txt
以下略

備忘録

・改行の扱いに注意その2
・0は自然数

16.ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

gengo16.py
import sys
args = sys.argv
cut_piece = int(args[1])

with open("hightemp.txt", "r") as f:
    lines = f.readlines()
    height = len(lines)
    cut_num = -(-height // cut_piece)
    for i in range(cut_piece):
        if i == cut_piece - 1:
            cut_lines = lines
        else:
            cut_lines =lines[:cut_num] 
            del lines[:cut_num]
        c = open("cut"+str(i)+".txt", "w")
        c.write("".join(cut_lines))
        c.close()

結果

<5分割>
cut0.txt
高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
(略)
cut4.txt
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

ターミナルで確認

macだとsplitのオプションで-nができない気がする(あきらめた)

備忘録

・切り上げのやり方は覚えておきたい
・popで刈り取れるのは1要素だけ,後ろからだから効率は悪い
←今回のコードもpop使うつもりで無理やり書いていたのでもう少し別の方法を考えたい・・・

17.1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.

gengo17.py
with open("hightemp.txt", "r") as f:
    lines = [_.split("\t") for _ in f.readlines()]
    element0 = {_[0] for _ in lines}
    print(element0)

結果

{'群馬県', '静岡県', '岐阜県', '千葉県', '愛知県', '高知県', '大阪府', '山梨県', '和歌山県', '山形県', '愛媛県', '埼玉県'}

ターミナルで確認

今度がんばる

備忘録

・集合を内包表記するときは{} 空集合はset()

18.各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

gengo18.py
with open("hightemp.txt", "r") as f:
    lines = [_.split("\t") for _ in f.readlines()]
    lines.sort(key= lambda x : float(x[2]), reverse = True)
    for line in lines:
        print("\t".join(line), end = "")

結果

高知県 江川崎 41 2013-08-12
埼玉県 熊谷 40.9 2007-08-16
岐阜県 多治見 40.9 2007-08-16
山形県 山形 40.8 1933-07-25
山梨県 甲府 40.7 2013-08-10
和歌山県 かつらぎ 40.6 1994-08-08
静岡県 天竜 40.6 1994-08-04
山梨県 勝沼 40.5 2013-08-10
埼玉県 越谷 40.4 2007-08-16
群馬県 館林 40.3 2007-08-16
群馬県 上里見 40.3 1998-07-04
愛知県 愛西 40.3 1994-08-05
千葉県 牛久 40.2 2004-07-20
静岡県 佐久間 40.2 2001-07-24
愛媛県 宇和島 40.2 1927-07-22
山形県 酒田 40.1 1978-08-03
岐阜県 美濃 40 2007-08-16
群馬県 前橋 40 2001-07-24
千葉県 茂原 39.9 2013-08-11
埼玉県 鳩山 39.9 1997-07-05
大阪府 豊中 39.9 1994-08-08
山梨県 大月 39.9 1990-07-19
山形県 鶴岡 39.9 1978-08-03
愛知県 名古屋 39.9 1942-08-02

ターミナルで確認

sort hightemp.txt -k 3 -r
以下略

備忘録

・lamda x:f(x)はxを入れたときにf(x)を返す関数

19.各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

gengo19.py
import collections

with open("hightemp.txt", "r") as f:
    kens = [_.split("\t")[0] for _ in f.readlines()]
    elements = list(set(kens))

results = collections.Counter(kens)
print(results)

results = sorted({ken:kens.count(ken) for ken in elements}.items(), key = lambda x:x[1], reverse = True)
print(results)

結果

Counter({'埼玉県': 3, '山形県': 3, '山梨県': 3, '群馬県': 3, '岐阜県': 2, '静岡県': 2, '愛知県': 2, '千葉県': 2, '高知県': 1, '和歌山県': 1, '愛媛県': 1, '大阪府': 1})
[('群馬県', 3), ('山梨県', 3), ('埼玉県', 3), ('山形県', 3), ('千葉県', 2), ('静岡県', 2), ('愛知県', 2), ('岐阜県', 2), ('和歌山県', 1), ('高知県', 1), ('愛媛県', 1), ('大阪府', 1)]

ターミナルで確認

今度やります

備忘録

・collectionsライブラリのcounterを使えばすぐできる(けど練習のために使わずやってもみた)
・sort()はリスト型のメソッドなので,辞書型ではitems()で出てきたdict_items型をsorted()でソートする形になる

第3章: 正規表現

Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある.
・1行に1記事の情報がJSON形式で格納される
・各行には記事名が"title"キーに,記事本文が"text"キーの辞書オブジェクトに格納され,そのオブジェクトがJSON形式で書き出される
・ファイル全体はgzipで圧縮される
以下の処理を行うプログラムを作成せよ.

20.JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

gengo20.py
import json
import gzip
with gzip.open("jawiki-country.json.gz", "r") as f:
    britain = [json.loads(article) for article in f if json.loads(article)["title"] == "イギリス"]
with open("britain.txt", "w")as b:
    b.write(britain[0]["text"])

結果

britain.txt
{{redirect|UK}}
{{基礎情報 国
|略名 = イギリス
|日本語国名 = グレートブリテン及び北アイルランド連合王国
|公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>
(以下略)

備忘録

・今思いついたけど内包表現使わずforループしてarticle["title"]がイギリスの時点でbreakしたほうが良かった気がする

21.カテゴリ名を含む行を抽出

記事中でカテゴリ名を宣言している行を抽出せよ.

gengo21.py
import re

results = []
with open("britain.txt", "r") as f:
    for line in f.readlines():
        if re.match(r"\[\[Category:", line):
            results.append(line)
for line in results:
    print(line, end = "")

結果

[[Category:イギリス|*]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国]]
[[Category:海洋国家]]
[[Category:君主国]]
[[Category:島国|くれいとふりてん]]
[[Category:1801年に設立された州・地域]]

備忘録

・re.match()は前から参照
・正規表現で使う記号([など)の前にはバックスラッシュ

22.カテゴリ名の抽出

記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.

gengo22.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
    categories = re.findall(r"\[\[Category:(.+?)(?:\||\])", s)

for category in categories:
    print(category)

結果

イギリス
英連邦王国
G8加盟国
欧州連合加盟国
海洋国家
君主国
島国
1801年に設立された州・地域

備忘録

・難産だった.正規表現は少しミスると思ってなかったところを引っ張ってきてしまう.
・キャプチャしないグループは(?:はにゃほにゃ).

23.セクション構造

記事中に含まれるセクション名とそのレベル(例えば"== セクション名 =="なら1)を表示せよ.

gengo23.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
selectionslist = re.findall(r"\=+(.+?)(\=+)\n", s)
selections = [[selection,len(equal)-1] for selection, equal in selectionslist]
for selection in selections:
    print(selection)

結果

['国名', 1]
['歴史', 1]
['地理', 1]
['気候', 2]
['政治', 1]
['外交と軍事', 1]
['地方行政区分', 1]
['主要都市', 2]
['科学技術', 1]
['経済', 1]
['鉱業', 2]
['農業', 2]
['貿易', 2]
['通貨', 2]
['企業', 2]
['交通', 1]
['道路', 2]
['鉄道', 2]
['海運', 2]
['航空', 2]
['通信', 1]
['国民', 1]
['言語', 2]
['宗教', 2]
[' 婚姻 ', 2]
['教育', 2]
['文化', 1]
['食文化', 2]
['文学', 2]
[' 哲学 ', 2]
['音楽', 2]
['イギリスのポピュラー音楽', 3]
['映画', 2]
['コメディ', 2]
['国花', 2]
['世界遺産', 2]
['祝祭日', 2]
['スポーツ', 1]
['サッカー', 2]
['競馬', 2]
['モータースポーツ', 2]
['脚注', 1]
['関連項目', 1]
['外部リンク', 1]

備忘録

・「哲学」「婚姻」もともと謎のスペースがあったのでそのまま持ってきたけど取ってもいいかも

24.ファイル参照の抽出

記事から参照されているメディアファイルをすべて抜き出せ.

gengo24.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
files = re.findall(r"(?:ファイル:|File:)(.+?)\|",s)
for file in files:
    print(file)

結果

Royal Coat of Arms of the United Kingdom.svg
Battle of Waterloo 1815.PNG
The British Empire.png
Uk topo en.jpg
BenNevis2005.jpg
Elizabeth II greets NASA GSFC employees, May 8, 2007 edit.jpg
Palace of Westminster, London - Feb 2007.jpg
David Cameron and Barack Obama at the G20 Summit in Toronto.jpg
Soldiers Trooping the Colour, 16th June 2007.jpg
Scotland Parliament Holyrood.jpg
London.bankofengland.arp.jpg
City of London skyline from London City Hall - Oct 2008.jpg
Oil platform in the North SeaPros.jpg
Eurostar at St Pancras Jan 2008.jpg
Heathrow T5.jpg
Anglospeak.svg
CHANDOS3.jpg
The Fabs.JPG
PalaceOfWestminsterAtNight.jpg
Westminster Abbey - West Door.jpg
Edinburgh Cockburn St dsc06789.jpg
Canterbury Cathedral - Portal Nave Cross-spire.jpeg
Kew Gardens Palm House, London - July 2009.jpg
2005-06-27 - United Kingdom - England - London - Greenwich.jpg
Stonehenge2007 07 30.jpg
Yard2.jpg
Durham Kathedrale Nahaufnahme.jpg
Roman Baths in Bath Spa, England - July 2006.jpg
Fountains Abbey view02 2005-08-27.jpg
Blenheim Palace IMG 3673.JPG
Liverpool Pier Head by night.jpg
Hadrian's Wall view near Greenhead.jpg
London Tower (1).JPG
Wembley Stadium, illuminated.jpg

備忘録

・試しにFileをfileにしてみたら引っかからなかった.きちんと大文字と小文字が区別されてた.

25.テンプレートの抽出

記事中に含まれる「基礎情報」テンプレートのフィールド名と値を抽出し,辞書オブジェクトとして格納せよ.

gengo25.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
s = re.match(r".*\{\{基礎情報.*\n\}\}\n", s, flags=re.DOTALL).group()
kiso_joholist = re.findall(r"\n\|(.*?)\s\=\s(.*?)(?:(?=\n\|)|(?=\n\}))", s, flags=re.DOTALL)
kiso_joho = {a : b for a, b in kiso_joholist}
print(kiso_joho)

結果

{'略名': 'イギリス', '日本語国名': 'グレートブリテン及び北アイルランド連合王国', '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]])<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]])<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]])<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]])<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>', '国旗画像': 'Flag of the United Kingdom.svg', '国章画像': '[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]', '国章リンク': '([[イギリスの国章|国章]])', '標語': '{{lang|fr|Dieu et mon droit}}<br/>([[フランス語]]:神と私の権利)', '国歌': '[[女王陛下万歳|神よ女王陛下を守り給え]]', '位置画像': 'Location_UK_EU_Europe_001.svg', '公用語': '[[英語]](事実上)', '首都': '[[ロンドン]]', '最大都市': 'ロンドン', '元首等肩書': '[[イギリスの君主|女王]]', '元首等氏名': '[[エリザベス2世]]', '首相等肩書': '[[イギリスの首相|首相]]', '首相等氏名': '[[デーヴィッド・キャメロン]]', '面積順位': '76', '面積大きさ': '1 E11', '面積値': '244,820', '水面積率': '1.3%', '人口統計年': '2011', '人口順位': '22', '人口大きさ': '1 E7', '人口値': '63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>', '人口密度値': '246', 'GDP統計年元': '2012', 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>', 'GDP統計年MER': '2012', 'GDP順位MER': '5', 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />', 'GDP統計年': '2012', 'GDP順位': '6', 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />', 'GDP/人': '36,727<ref name="imf-statistics-gdp" />', '建国形態': '建国', '確立形態1': '[[イングランド王国]]/[[スコットランド王国]]<br />(両国とも[[連合法 (1707年)|1707年連合法]]まで)', '確立年月日1': '[[927年]]/[[843年]]', '確立形態2': '[[グレートブリテン王国]]建国<br />([[連合法 (1707年)|1707年連合法]])', '確立年月日2': '[[1707年]]', '確立形態3': '[[グレートブリテン及びアイルランド連合王国]]建国<br />([[連合法 (1800年)|1800年連合法]])', '確立年月日3': '[[1801年]]', '確立形態4': "現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更", '確立年月日4': '[[1927年]]', '通貨': '[[スターリング・ポンド|UKポンド]] (&pound;)', '通貨コード': 'GBP', '時間帯': '±0', '夏時間': '+1', 'ISO 3166-1': 'GB / GBR', 'ccTLD': '[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>', '国際電話番号': '44', '注記': '<references />'}

備忘録

・マジで無理 正規表現沼すぎるのであんまり複雑に組み合わせないようにしたい
・(?=ほにゃらら)で後を参照"だけ"する

26.強調マークアップの除去

25の処理時に,テンプレートの値からMediaWikiの強調マークアップ(弱い強調,強調,強い強調のすべて)を除去してテキストに変換せよ(参考: マークアップ早見表).

gengo26.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
s = re.match(r".*\{\{基礎情報.*\n\}\}\n", s, flags=re.DOTALL).group()
s = re.sub(r"\'{2,5}", "", s)
kiso_joholist = re.findall(r"\n\|(.*?)\s\=\s(.*?)(?:(?=\n\|)|(?=\n\}))", s, flags=re.DOTALL)
kiso_joho = {a : b for a, b in kiso_joholist}
print(kiso_joho)

結果

{'略名': 'イギリス', '日本語国名': 'グレートブリテン及び北アイルランド連合王国', '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]])<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]])<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]])<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]])<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>', '国旗画像': 'Flag of the United Kingdom.svg', '国章画像': '[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]', '国章リンク': '([[イギリスの国章|国章]])', '標語': '{{lang|fr|Dieu et mon droit}}<br/>([[フランス語]]:神と私の権利)', '国歌': '[[女王陛下万歳|神よ女王陛下を守り給え]]', '位置画像': 'Location_UK_EU_Europe_001.svg', '公用語': '[[英語]](事実上)', '首都': '[[ロンドン]]', '最大都市': 'ロンドン', '元首等肩書': '[[イギリスの君主|女王]]', '元首等氏名': '[[エリザベス2世]]', '首相等肩書': '[[イギリスの首相|首相]]', '首相等氏名': '[[デーヴィッド・キャメロン]]', '面積順位': '76', '面積大きさ': '1 E11', '面積値': '244,820', '水面積率': '1.3%', '人口統計年': '2011', '人口順位': '22', '人口大きさ': '1 E7', '人口値': '63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>', '人口密度値': '246', 'GDP統計年元': '2012', 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>', 'GDP統計年MER': '2012', 'GDP順位MER': '5', 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />', 'GDP統計年': '2012', 'GDP順位': '6', 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />', 'GDP/人': '36,727<ref name="imf-statistics-gdp" />', '建国形態': '建国', '確立形態1': '[[イングランド王国]]/[[スコットランド王国]]<br />(両国とも[[連合法 (1707年)|1707年連合法]]まで)', '確立年月日1': '[[927年]]/[[843年]]', '確立形態2': '[[グレートブリテン王国]]建国<br />([[連合法 (1707年)|1707年連合法]])', '確立年月日2': '[[1707年]]', '確立形態3': '[[グレートブリテン及びアイルランド連合王国]]建国<br />([[連合法 (1800年)|1800年連合法]])', '確立年月日3': '[[1801年]]', '確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更', '確立年月日4': '[[1927年]]', '通貨': '[[スターリング・ポンド|UKポンド]] (&pound;)', '通貨コード': 'GBP', '時間帯': '±0', '夏時間': '+1', 'ISO 3166-1': 'GB / GBR', 'ccTLD': '[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>', '国際電話番号': '44', '注記': '<references />'}}

備忘録

・強調表現取れてるのは「現在の国号〜」のとこだけかしら.

27.内部リンクの除去

26の処理に加えて,テンプレートの値からMediaWikiの内部リンクマークアップを除去し,テキストに変換せよ(参考: マークアップ早見表).

gengo27.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
s = re.match(r".*\{\{基礎情報.*\n\}\}\n", s, flags=re.DOTALL).group()
s = re.sub(r"\'{2,5}", "", s)
s = re.sub(r"(?<=\[\[(?!(Category\:|ファイル)))[^\|\]]*\|", "", s)
kiso_joholist = re.findall(r"\n\|(.*?)\s\=\s(.*?)(?:(?=\n\|)|(?=\n\}))", s, flags=re.DOTALL)
kiso_joho = {a : b for a, b in kiso_joholist}
print(kiso_joho)

結果

{'略名': 'イギリス', '日本語国名': 'グレートブリテン及び北アイルランド連合王国', '公式国名': '{{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br/>\n*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}([[スコットランド・ゲール語]])<br/>\n*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}([[ウェールズ語]])<br/>\n*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}([[アイルランド語]])<br/>\n*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}([[コーンウォール語]])<br/>\n*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}([[スコットランド語]])<br/>\n**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}(アルスター・スコットランド語)</ref>', '国旗画像': 'Flag of the United Kingdom.svg', '国章画像': '[[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]', '国章リンク': '([[国章]])', '標語': '{{lang|fr|Dieu et mon droit}}<br/>([[フランス語]]:神と私の権利)', '国歌': '[[神よ女王陛下を守り給え]]', '位置画像': 'Location_UK_EU_Europe_001.svg', '公用語': '[[英語]](事実上)', '首都': '[[ロンドン]]', '最大都市': 'ロンドン', '元首等肩書': '[[女王]]', '元首等氏名': '[[エリザベス2世]]', '首相等肩書': '[[首相]]', '首相等氏名': '[[デーヴィッド・キャメロン]]', '面積順位': '76', '面積大きさ': '1 E11', '面積値': '244,820', '水面積率': '1.3%', '人口統計年': '2011', '人口順位': '22', '人口大きさ': '1 E7', '人口値': '63,181,775<ref>[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]</ref>', '人口密度値': '246', 'GDP統計年元': '2012', 'GDP値元': '1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>', 'GDP統計年MER': '2012', 'GDP順位MER': '5', 'GDP値MER': '2兆4337億<ref name="imf-statistics-gdp" />', 'GDP統計年': '2012', 'GDP順位': '6', 'GDP値': '2兆3162億<ref name="imf-statistics-gdp" />', 'GDP/人': '36,727<ref name="imf-statistics-gdp" />', '建国形態': '建国', '確立形態1': '[[イングランド王国]]/[[スコットランド王国]]<br />(両国とも[[1707年連合法]]まで)', '確立年月日1': '[[927年]]/[[843年]]', '確立形態2': '[[グレートブリテン王国]]建国<br />([[1707年連合法]])', '確立年月日2': '[[1707年]]', '確立形態3': '[[グレートブリテン及びアイルランド連合王国]]建国<br />([[1800年連合法]])', '確立年月日3': '[[1801年]]', '確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更', '確立年月日4': '[[1927年]]', '通貨': '[[UKポンド]] (&pound;)', '通貨コード': 'GBP', '時間帯': '±0', '夏時間': '+1', 'ISO 3166-1': 'GB / GBR', 'ccTLD': '[[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数。</ref>', '国際電話番号': '44', '注記': '<references />'}

備忘録

・[[ほにゃらら]]のなかから[[のあとに"Category:"もしくは"ファイル"がないやつを取ってる."|表示文字"があるものは表示文字を残してる.

28.MediaWikiマークアップの除去

27の処理に加えて,テンプレートの値からMediaWikiマークアップを可能な限り除去し,国の基本情報を整形せよ.

gengo28.py
import re
with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
s = re.match(r".*\{\{基礎情報.*\n\}\}\n", s, flags=re.DOTALL).group()
s = re.sub(r"\'{2,5}", "", s)
s = re.sub(r"(?<=\[\[(?!(Category\:|ファイル)))[^\|\]]*\|", "", s)
s = re.sub(r"\[\[", "", s)
s = re.sub(r"\]\]", "", s)
s = re.sub(r"\<[^\>]*\>", "", s)
s = re.sub(r"\{\{[^\|]+\|[^\|]+\|(?=.+\}\})","", s)
s = re.sub(r"\}\}","", s)
kiso_joholist = re.findall(r"\n\|(.*?)\s\=\s(.*?)(?:(?=\n\|)|(?=\n\}))", s, flags=re.DOTALL)
kiso_joho = {a : b for a, b in kiso_joholist}
print(kiso_joho)

結果

{'略名': 'イギリス', '日本語国名': 'グレートブリテン及び北アイルランド連合王国', '公式国名': 'United Kingdom of Great Britain and Northern Ireland英語以外での正式国名:\n*An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath(スコットランド・ゲール語)\n*Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon(ウェールズ語)\n*Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann(アイルランド語)\n*An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh(コーンウォール語)\n*Unitit Kinrick o Great Breetain an Northren Ireland(スコットランド語)\n**Claught Kängrick o Docht Brätain an Norlin Airlann、Unitet Kängdom o Great Brittain an Norlin Airlann(アルスター・スコットランド語)', '国旗画像': 'Flag of the United Kingdom.svg', '国章画像': 'ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章', '国章リンク': '(国章)', '標語': 'Dieu et mon droit(フランス語:神と私の権利)', '国歌': '神よ女王陛下を守り給え', '位置画像': 'Location_UK_EU_Europe_001.svg', '公用語': '英語(事実上)', '首都': 'ロンドン', '最大都市': 'ロンドン', '元首等肩書': '女王', '元首等氏名': 'エリザベス2世', '首相等肩書': '首相', '首相等氏名': 'デーヴィッド・キャメロン', '面積順位': '76', '面積大きさ': '1 E11', '面積値': '244,820', '水面積率': '1.3%', '人口統計年': '2011', '人口順位': '22', '人口大きさ': '1 E7', '人口値': '63,181,775[http://esa.un.org/unpd/wpp/Excel-Data/population.htm United Nations Department of Economic and Social Affairs>Population Division>Data>Population>Total Population]', '人口密度値': '246', 'GDP統計年元': '2012', 'GDP値元': '1兆5478億[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a= IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]', 'GDP統計年MER': '2012', 'GDP順位MER': '5', 'GDP値MER': '2兆4337億', 'GDP統計年': '2012', 'GDP順位': '6', 'GDP値': '2兆3162億', 'GDP/人': '36,727', '建国形態': '建国', '確立形態1': 'イングランド王国/スコットランド王国(両国とも1707年連合法まで)', '確立年月日1': '927年/843年', '確立形態2': 'グレートブリテン王国建国(1707年連合法)', '確立年月日2': '1707年', '確立形態3': 'グレートブリテン及びアイルランド連合王国建国(1800年連合法)', '確立年月日3': '1801年', '確立形態4': '現在の国号「グレートブリテン及び北アイルランド連合王国」に変更', '確立年月日4': '1927年', '通貨': 'UKポンド (&pound;)', '通貨コード': 'GBP', '時間帯': '±0', '夏時間': '+1', 'ISO 3166-1': 'GB / GBR', 'ccTLD': '.uk / .gb使用は.ukに比べ圧倒的少数。', '国際電話番号': '44'}

備忘録

・もうやだ

29.国旗画像のURLを取得する

テンプレートの内容を利用し,国旗画像のURLを取得せよ.(ヒント: MediaWiki APIimageinfoを呼び出して,ファイル参照をURLに変換すればよい)

gengo29.py
import re
import json
import requests

with open("britain.txt", "r") as f:
    s = "".join(f.readlines())
imagetitle = re.findall(r"(?<=国旗画像\s\=\s)(.*)(?=\n)", s)[0]

rq = requests.Session()

URL = "https://en.wikipedia.org/w/api.php"

PARAMS = {
    "action":"query",
    "format":"json",
    "prop": "imageinfo",
    "titles": f"File:{imagetitle}",
    "iiprop":"url"
}

R = rq.get(url=URL, params=PARAMS)
result = R.json()
result = list(result["query"]["pages"].values())
print(result[0]["imageinfo"][0]["url"])

結果

https://upload.wikimedia.org/wikipedia/en/a/ae/Flag_of_the_United_Kingdom.svg

備忘録

・jsonとアッチソンとハッカソンは似てる

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1