【Python】PythonのWikipedia APIを使ってみよう!後編
[:contents]
はじめに
こんにちは、絶賛模索中のサンナボコナです。前回はWikipedia APIの簡単な使い方を紹介しつつ、最後に入力した単語をWikipediaで検索してくれるちょっとしたプログラムを作りました。今回は、そちらで書いたコードを詳しく見てみたいと思います。
前回の記事はこちら☟
コード全体
まずはコードの全体像をつかんでみましょう。このあと上から順番に解説していくので、スッとわかるところは飛ばしていただいてかまいません!
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に触れていきましょう!
ありがとうございました!