ProgateのあとのPython

Pythonを勉強してるんだけど、Progateが終わったらいったい何をすればいいんだろう?そんな皆さん(私を含む)のために、Progateでの勉強に毛が生えた程度しか知らない京大生が、模索しながらPythonを勉強する記録を残していきます!順番や効率などめちゃくちゃですが、ProgateでPythonの基礎を習得して何をすべきかわからなくなった方にとって、少しでも参考になればと思います。

【Python】PythonのWikipedia APIを使ってみよう!後編

 [:contents]

 

はじめに

 こんにちは、絶賛模索中のサンナボコナです。前回はWikipedia APIの簡単な使い方を紹介しつつ、最後に入力した単語をWikipediaで検索してくれるちょっとしたプログラムを作りました。今回は、そちらで書いたコードを詳しく見てみたいと思います。

 前回の記事はこちら☟

sannabocona.hatenablog.com

 

コード全体 

 まずはコードの全体像をつかんでみましょう。このあと上から順番に解説していくので、スッとわかるところは飛ばしていただいてかまいません!

import wikipedia


def wikipediaSearch(search_text):
	response_string = ""
	wikipedia.set_lang("ja")
	search_response = wikipedia.search(search_text)
	if not search_response:
		response_string = "その単語は登録されていません。"
		return response_string
	try:
		wiki_page = wikipedia.page(search_response[0])
	except Exception as e:
		response_string = "エラーが発生しました。\n{}\n{}".format(e.message, str(e))
		return response_string
	wiki_content = wiki_page.content
	response_string += wiki_content[0:wiki_content.find("。")] + "。\n"
	response_string += "リンクはこちら:" + wiki_page.url
	return response_string


if __name__ == "__main__":
	while True:
		user_input = input("検索したい単語を入力してください。:")
		if not user_input:
			break
		print(wikipediaSearch(user_input))

 

 

コード解説

 まずはライブラリをインポート。これをしないと始まりません。

import wikipedia

 

 そしてやりたいことを関数化してしまいます。関数の一行目では、出力する返答をいったん空の文字列として用意しています。あとでここに追加していくという形ですね。二行目では、前回解説したように、言語を日本語に設定しています。

def wikipediaSearch(search_text):
	response_string = ""
	wikipedia.set_lang("ja")

 

 続いて入力された単語を「search」関数で検索し、返ってくるリストを「search_response」に格納します。検索結果がなかった場合空のリストが返ってくるので、その場合はif文で分岐してその旨を伝えるようにしました。

	search_response = wikipedia.search(search_text)
	if not search_response:
		response_string = "その単語は登録されていません。"
		return response_string

 ここで、「if not search_response」としているのは、Pythonとしてこういう書き方が推奨されているらしいからです。一応「if len(search_response) == 0」や「if search_response == []」としても同じように動きます。推奨はしませんが。

 

  お次は、 「page」関数を用いてページの情報を取得してみましょう。ここで「try」と「except」を使います。簡単に説明すると、「try」の文を実行しようと挑戦してみて、特に問題なければそのまま(「except」の文はスキップされます。)、エラーが発生した場合はその処理をせずに「except」の文を実行する、という構文です。

 ここでは、検索結果のリストの0番目の要素、つまりもっとも関連性の高い単語のページを「wiki_page」に代入しようとしています。ここでエラーが発生した場合、その旨が「response_string」に代入されるようになっています。

	try:
		wiki_page = wikipedia.page(search_response[0])
	except Exception as e:
		response_string = "エラーが発生しました。\n{}\n{}".format(e.message, str(e))
		return response_string

 ところで、文字列に何やら見慣れないものがくっついていますね。これはformat関数といって、文字列の中に変数を埋め込むことができる便利な書き方です。使い方としては、文字列の中で変数を埋め込みたい部分に「{}」と入力しておいて、その文字列の後に「.format(埋め込みたい変数)」と付け加えれば完了です!2つ以上ある場合も、上記のコードのように順番に書いていけば対応してくれます。順番を気にせず埋め込める書き方もあるのですが、それはまたいずれ別の機会に。

 

  さあ、次は所得したページをもとに、使いたい情報を取り出してみましょう。まずは「content」関数でページ全体の情報を取得し、「wiki_content」に代入します。

 ここからその単語の概要を抜き出したいのですが、どうしたらいいでしょう。私の答えは、「ページの最初から初めの”。”までの文章を抜き出す。」ことです!!Wikipediaは最初の一文に概要が簡潔に書いてあるので、それを利用しました。そのままURLも取得し、それぞれを「response_string」に追加しました。そして最後にreturnで「response_string」を返しています。

	wiki_content = wiki_page.content
	response_string += wiki_content[0:wiki_content.find("。")] + "。\n"
	response_string += "リンクはこちら:" + wiki_page.url
	return response_string

  ここでは「find関数」を利用しています。この関数を文字列に使うと、()の中の文字が何文字目に出てくるかを数字で返してくれます(存在しない場合は-1)。そのため、「wiki_content[0:wiki_content.find("。")]」とすることで、ページのうち最初から”。”までの文字列を取得できるのです。

 

 最後です。簡単に言うと、whileでループを回しながら、ユーザーの入力を「wikipediaSearch」に渡し、その返答を出力させています。ちなみに何も入力なくEnterを押すと、「user_input」が「""」と空の文字列となり、if文で分岐してループを抜け出し修了するようになっています。ここのif文は「if not search_response」の時と同じようにnotを使って処理していますね。

if __name__ == "__main__":
	while True:
		user_input = input("検索したい単語を入力してください。:")
		if not user_input:
			break
		print(wikipediaSearch(user_input))

  「if __name__ == "__main__"」とは、プログラムとして起動された場合に以下の処理を行いますよ、というif文です。モジュールとしてインポートされたときは何も働きません。とりあえずそういうものだと思っていただければ。

 

おわりに

 いかがだったでしょうか?Wikipediaを扱えるライブラリを使って軽く遊べるようになりましたね!こういった小さなプログラムでも、新しい発見はあるかもしれません。基本的なことを習得できた後は、このようにいろいろな角度からPythonに触れていきましょう!

 ありがとうございました!