the invention of t88

工作、資格取得、データ分析のことなど

Beautiful Soupでwikipediaのページから料理名を抽出

景品のTシャツの為だけにAlexaスキルを開発中。
www.t88.work

「献立提案」といいつつ、
昨晩のメニュー
栄養バランス
冷蔵庫の中身
個人の好き嫌いも考慮せず、
ランダムに料理名を返すスキル。

せめて料理の種類ぐらいは増やしたい。
※現状、手打ちで適当に入れた、全7品目

頭に浮かんだものを入力していくのは限界がありそう*1
なので、wikipediaの料理関連のページから料理名を抽出することにする。
道具として、python + Beautiful Soupを使用。

wikipedia 料理ページの確認

洋食 - Wikipedia

たとえば、「洋食」のページ。
ページ内に色々な料理名があることが分かる。
使えそうな感じ。

料理名は大体、その料理個別ページのリンクとなっている。
aタグで検索すれば、ゴミを巻き込みつつも、
料理名を抽出できそう。*2

pythonコード

必要なライブラリをインポート。

from urllib.request import urlopen
from bs4 import BeautifulSoup
import pandas as pd

複数ページから抽出するので、 一連の流れをまとめた自作関数を作成。
引数にデータ取得元のurlを受け取り、
urllibでHTMコンテンツを取得。
beautiful soupの.find_all('a')でaタグ部分を全て取得。
tag内のテキストのみ抽出し、pandasのseries構造にして返す。

#urlを指定し、aタグ内のテキストを抜き出す関数
def scraping(url):
    html = urlopen(url)
    bsObj = BeautifulSoup(html.read(),"html5lib")
    a_tag_list = bsObj.find_all('a')    
    
    return pd.Series([x.text for x in a_tag_list])

目ぼしいページを探してきてスクレイピング。

#wikipediaページからスクレイピング
list1 = scraping("https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%96%99%E7%90%86") #日本料理
list2 = scraping("https://ja.wikipedia.org/wiki/%E6%B4%8B%E9%A3%9F") #洋食
list3 = scraping("https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%A1%E3%83%AA%E3%82%AB%E6%96%99%E7%90%86") #アメリカ料理
list4 = scraping("https://ja.wikipedia.org/wiki/%E4%B8%AD%E8%8F%AF%E6%96%99%E7%90%86") #中華料理
list5 = scraping("https://ja.wikipedia.org/wiki/%E9%9F%93%E5%9B%BD%E6%96%99%E7%90%86") #韓国料理
list6 = scraping("https://ja.wikipedia.org/wiki/%E3%82%A4%E3%82%BF%E3%83%AA%E3%82%A2%E6%96%99%E7%90%86") #イタリア料理
list7 = scraping("https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%AF%E3%82%A4%E6%96%99%E7%90%86") #ハワイ料理
list8 = scraping("https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%83%89%E3%83%8D%E3%82%B7%E3%82%A2%E6%96%99%E7%90%86") #イタリア料理
list9 = scraping("https://ja.wikipedia.org/wiki/%E3%83%AD%E3%82%B7%E3%82%A2%E6%96%99%E7%90%86") #ロシア料理

最終的に一つにまとめる。

#リストを統合
kondate_list = pd.concat([list1,list2,list3,list4,list5,list6,list7,list8,list9])

明らかなゴミを削除。

#重複値を除去
kondate_list = kondate_list.drop_duplicates()
#半角英数字を含むものを除去
kondate_list = kondate_list[~kondate_list.str.match('.*[a-zA-Z0-9]')]

結果をcsvとして出力。

#csvに出力 ※使えるパラメータの関係でdataframeに変換
df = pd.DataFrame(kondate_list)
df.to_csv('kondate_list.csv',index=False,line_terminator=',\n',quoting=1)

※この部分は本題ではないが、
alexaスキルの処理コード内への転記を想定して、
出力形式の調整を行っている。

line_terminator で末尾にカンマを付与。
quoting=1(QUOTE_ALL) で全ての要素をクォートする。

結果

f:id:take213uv:20180814164002p:plain

こんな感じで料理名の抽出が出来た。
実際はゴミが沢山混じってるので、手作業で除去。
最終的に415種類の料理が残った。

[参考:料理名一覧]
ぼたもち, 団子, すき焼き, てんぷら, 寿司, カレー, ラーメン, 天ぷら, レバ刺し, カルパッチョ, ユッケ, タルタルステーキ, 焼肉, ジャーキー, 干肉, ビスケット, クッキー, 縄文クッキー, すいとん, 粥, 塩辛, なれずし, おこわ, 金山寺味噌, 点心, うどん, 饅頭, 羊羹, がんもどき, カステラ, コンペイトウ, お好み焼き, 鉄板焼き, カリフォルニアロール, 雑煮, 赤飯, コンニャク, 麦飯, はったい粉, 干柿, 煮こごり, 凍豆腐, 七草粥, 小豆粥, 草餅, 甘茶, ちまき, 柏餅, 豆ごはん, 味噌田楽, 素麺, 年越しそば, くさや, 島寿司, けんちん汁, おにぎり, にぎり寿司, 江戸前寿司, 巻寿司, ちらし寿司, 稲荷寿司, 押し寿司, 酢飯, 雑炊, おじや, 茶漬け, 炊き込みご飯, 栗飯, 深川飯, 鯛飯, 五目飯, 混ぜご飯, 鰻丼, 天丼, 親子丼, 鉄火丼, 木の葉丼, しらす丼, 麦とろ, 冷汁, 卵かけご飯, 煎餅, 冷麦, 味噌汁, 粕汁, 潮汁, 呉汁, 馬刺し, 鶏刺し, おでん, 寄せ鍋, ちり鍋, 掻き揚げ, から揚げ, 薩摩揚げ, 油揚げ, 焼き魚, 焼き鳥, 卵焼き, だし巻き卵, 薄焼き卵, 煮魚, 煮しめ, 甘露煮, 佃煮, 大和煮, 風呂吹き, 若竹煮, 昆布巻き, 煮びたし, チャンプルー, 茶碗蒸し, 玉子豆腐, 飯蒸し, 蒲鉾, 竹輪, はんぺん, つくね, おひたし, ぬた, 胡麻和え, トンカツ, カレーライス, しゃぶしゃぶ, もつ鍋, 牛丼, カツ丼, 豚汁, 肉じゃが, 生姜焼き, もんじゃ焼き, たこ焼き, ハヤシライス, オムライス, コロッケ, カキフライ, エビフライ, メンチカツ, スパゲッティ, ナポリタン, たらこスパゲッティ, 納豆スパゲッティ, クリームシチュー, ドリア, ピラフ, ハンバーガー, ライスバーガー, テリヤキバーガー, 菓子パン, 総菜パン, あんぱん, クリームパン, コロネ, メロンパン, カレーパン, 焼きそばパン, カツサンド, ショートケーキ, 生チョコレート, スフレチーズケーキ, ミル・クレープ, プリンアラモード, ダックワーズ, 冷やし中華, 担担麺, 長崎ちゃんぽん, 皿うどん, 餃子, 天津飯, 焼きそば, タコライス, カニカマ, オートミール, パスタ, サラダ, サンドイッチ, ポークカツレツ, とんかつ, エスカロップ, マカロニグラタン, コンソメスープ, ポタージュ, ビーフシチュー, ピカタ, ステーキ, どんどん焼き, チキンバスケット, ハンバーグ, オムレツ, ケチャップライス, ハムエッグ, ベーコンエッグ, ハッシュドビーフ, ビーフストロガノフ, チキンライス, 鶏肉, トマトケチャップ, 焼き飯, カツレツ, 牛カツ, 豚カツ, 鶏カツ, ポークソテー, ムニエル, ポトフ, ロールキャベツ, グラタン, レトルト食品, クラムチャウダー, ベイクドビーンズ, コーンスープ, バーベキュー, トルティーヤ, ドーナツ, ベーグル, スコーン, プレッツェル, パンケーキ, マフィン, ワッフル, フレンチトースト, コーンブレッド, ミートボール, フェットゥチーネ・アルフレード, フェットゥチーネ, マカロニ・アンド・チーズ, ジャンバラヤ, シアトルロール, フィラデルフィアロール, ホッピン・ジョン, チャウダー, ヴィシソワーズ, チキンスープ, ピーナッツスープ, ホットドッグ, アメリカンクラブハウスサンド, グリルドチーズサンドイッチ, ピーナッツバターとジェリーのサンドイッチ, ルーベンサンド, ビーフステーキ, ミートローフ, ローストチキン, フライドチキン, テリヤキ, ポークチョップ, ローストターキー, 七面鳥, バッファローウィング, カントリー・キャプテン, ゲフィルテ・フィッシュ, シュリンプ・スキャンピ, ソフトシェルクラブ, クラブケーキ, オイスター・ロックフェラー, ホワイトソース, フライドポテト, マッシュポテト, ハッシュドポテト, テイタートッツ, コールスロー, シーザーサラダ, コブサラダ, アップルパイ, パンプキンパイ, ピーカンパイ, キーライムパイ, バンブルベリーパイ, シフォンケーキ, ジャーマンケーキ, ジンジャーブレッド, ブラウニー, カンノーロ, バナナプディング, プリン, パーシモンプディング, ファッジ, チョコチップクッキー, シャーベット, サンデー, ミシシッピーマッドパイ, チョコレート, バナナスプリット, エンゼル・フード・ケーキ, デビルズ・フード・ケーキ, コーンフレーク, グラノーラ, ポーク・アンド・ビーンズ, チリコンカーン, ポットパイ, エッグベネディクト, アメリカンドッグ, チャプスイ, 小籠包, ナシゴレン, 焼き餃子, エビチリ, 酢豚, 八宝菜, ラフテー, 北京ダック, ジャージャー麺, 水餃子, サンラータン, ふかひれ, シュウマイ, チャーシュー, 雲吞, エビ蒸しギョウザ, 上海ガニの蒸しガニ, 餛飩, 中華丼, 天津丼, チャーハン, ビーフン, ワンタン麺, 炸醤麺, エビのチリソース, 中華まん, 春巻き, チンジャオロース, 中華スープ, 月餅, マンゴープリン, キムチ, ナムル, クッパ, チゲ, ビビンバ, クレープ, プルコギ, チヂミ, トッポッキ, トースト, ホットサンド, たい焼き, 即席めん, サムゲタン, キムチチゲ, 純豆腐, カルビ, サムギョプサル, タッカルビ, タッカンマリ, トッカルビ, チャプチェ, 春雨, 炒飯, 肉まん, 天婦羅, 豚足, 今川焼き, かき氷, リゾット, ラザニア, ラビオリ, ナポリピッツァ, マルゲリータ, マリナーラ, クアットロ・フォルマッジ, フォカッチャ, ブルスケッタ, ミネストローネ, プロシュット, パンチェッタ, サラミ, アクアパッツア, フリット, バーニャ・カウダ, カプレーゼ, ティラミス, パンナ・コッタ, 生ハムメロン, ポケ, ゼリー, 芋羊羹, 白飯, マカロニサラダ, ポテトサラダ, スパムむすび, マラサダ, ロコモコ, ハンバーガー・ステーキ, 目玉焼き, おむすび, いなり寿司, ライスヌードル, ロミロミ, サーモン, フリフリ・チキン, 唐揚げ, チキンカツ, サーターアンダーギー, 羽二重餅, ハロハロ, 肉団子, 丸焼き, ミーゴレン, 即席ラーメン, インドミー・ミーゴレン, インスタントラーメン, そぼろ, アヤムゴレン, 焼売, ワンタン, シュークリーム, ゆで卵, 錦糸玉子, 厚揚げ, チャプチャイ, ボルシチ, ソーセージ, ピロシキ, ミートパイ, ペリメニ, ザワークラウト



前の記事:公開用のアレクサスキル作成

次の記事:作成したアレクサスキルを申請する

Tシャツの為だけにアレクサスキル開発 目次

*1:手打ちでまず最初に入れたのがハンバーグ、オムライスという時点で発想の貧困さが滲み出ている

*2:個別ページもないマイナー料理は要らない。