Amazon Echoでバスの時刻を確認 (python) 

#はじめに

とりあえず動けばいい方向けです。
私自身、プログラミングはほとんど知識はありませんので、見よう見まねですのでご了承ください。
以下の記事を参考にしています。
https://qiita.com/osa9/items/e2cc6318b7ed736ac6ff

プログラミングの概要を知りたい方は以下の公式ドキュメントが参考になると思います。
https://alexa-skills-kit-python-sdk.readthedocs.io/ja/latest/DEVELOPING_YOUR_FIRST_SKILL.html
Alexa Skills Kit SDK for Python→初めてのスキル開発

#概要
アレクサに「次のバスは？」と聞くと、「次は約4分で発車します。次は、約20分で発車します」などのように回答できるようになります。「次は、」を除き、元々のページにある文字をそのまま出力しています。
バスは川崎臨港バスで作ります。
実際に取得するURLは下記とします。

https://rinkobus.bus-navigation.jp/wgsys/wgp/bus.htm?tabName=mapTab&selectedLandmarkCatCd=&selectfiftySoundCharacter=&from=%E5%B7%9D%E5%B4%8E%E9%A7%85%E8%A5%BF%E5%8F%A3&fromType=1&to=%E9%B6%B4%E8%A6%8B%E9%A7%85%E8%A5%BF%E5%8F%A3&toType=1&locale=ja&fromlat=35.531565&fromlng=139.69589500000006&tolat=35.508252&tolng=139.675119&fromSignpoleKey=&routeLayoutCd=&bsid=1&fromBusStopCd=&toBusStopCd=&mapFlag=true&existYn=N&routeKey=&nextDiagramFlag=&diaRevisedDate=

※上記は例です。他の路線は下記から検索できます。
https://rinkobus.bus-navigation.jp/wgsys/wgp/search.htm

#手順

[alexa developer console](https://developer.amazon.com/alexa/console/ask)を開きます
スキルを作成ボタンをクリックします。
スキル名を「バス時刻取得」などと入力します。
「1.スキルに追加するモデルを選択」に「カスタム」を選択します。
「2.スキルのバックエンドリソースをホスティングする方法を選択」に「Alexa-Hosted (Python)」を選択します。
※「Alexa-Hosted (Python)」とすることで、プログラムをalexa developer consoleで作成できます。「ユーザー定義のプロビジョニング」を選択すると、AWSなど、利用者が別に用意した環境でプログラムを作成する必要があります。

「スキルを作成」を選択します。
「Hello Worldスキル」を選択します。しばらくすると環境の準備ができます。
「ビルド」ページで呼び出し名に「次のバス」と入力します。（インテントの入力は不要です。）
「コードエディタ」ページを開きます。
「lambda_function.py」を選択します。「logger.setLevel(logging.INFO)」の下に以下をコピペします。

```
import requests
from bs4 import BeautifulSoup
r = requests.get("https://rinkobus.bus-navigation.jp/wgsys/wgp/bus.htm?tabName=mapTab&selectedLandmarkCatCd=&selectfiftySoundCharacter=&from=%E5%B7%9D%E5%B4%8E%E9%A7%85%E8%A5%BF%E5%8F%A3&fromType=1&to=%E9%B6%B4%E8%A6%8B%E9%A7%85%E8%A5%BF%E5%8F%A3&toType=1&locale=ja&fromlat=35.531565&fromlng=139.69589500000006&tolat=35.508252&tolng=139.675119&fromSignpoleKey=&routeLayoutCd=&bsid=1&fromBusStopCd=&toBusStopCd=&mapFlag=true&existYn=N&routeKey=&nextDiagramFlag=&diaRevisedDate=")
soup = BeautifulSoup(r.content, "html.parser")
def remove_whitespace(str):
    return ''.join(str.split())
buss1 = remove_whitespace(soup.find_all("td") [12].text)
buss2 = "、その次は" + remove_whitespace(soup.find_all("td") [25].text)
speak_output = buss1 + buss2
```
つづいて、初めに出てくる以下の個所で「.ask(speak_output)」を#でコメントアウトします。

```
        return (
            handler_input.response_builder
                .speak(speak_output)
                #.ask(speak_output)
                .response
        )
```

つづいて、「requirements.txt」を選択して、「beautifulsoup4」を追記します。

以上で完了です。

「テスト」ページで動作を確認します。
「次のバス」と入力して、正常に動作することを確認します。
最後に公開設定を行います。自分だけで使う場合はベータテストを設定します。

#解説
<font color="Blue">
import requests
from bs4 import BeautifulSoup
</font>

BeautifulSoupというというコンポーネントをインポートしています。
これはpython言語におけるHTMLページからスクレイピング(外部からデータを取得する手法）ツールになります。
<font color="Blue">
r = requests.get("URL")
soup = BeautifulSoup(r.content, "html.parser")
</font>

BeautifulSoupを使う場合の定型句です
<font color="Blue">
def remove_whitespace(str):
    return ''.join(str.split())
</font>

空白を削除するための準備です。
<font color="Blue">
buss1 = remove_whitespace(soup.find_all("td") [12].text)
buss2 = "、その次は" + remove_whitespace(soup.find_all("td") [25].text)
speak_output = buss1 + buss2
</font>

上記の　soup.find_all("td") [12]　で時刻表のページから次のバスまでの時間を表示している個所を取得します。これはBeautifulSoupで実現します。この一文で、「htmlタグの「td」部分のうち、12番目のものを取得する」という命令になります。
このあたりは取得したいWebページによって試行錯誤が必要なので、ローカル環境で試す必要があります。