質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3107閲覧

WEBスクレイピング 作成したpythonコードの見直しをしたい

nasu0922

総合スコア17

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/05 08:30

編集2019/03/05 09:19

実現したいこと・問題点など

python始めて1ヶ月足らずの超初心者です。
初めて質問で分かりにくい文章かもしれませんが
何卒、よろしくお願いいたします。

現在、dmm.ぱちタウンから試作で特定のパチンコホールの基本情報と機種情報をWEBスクレイピングしていますが、
取得データが意図した結果になっていませんでした。

どなたかご教授の程よろしくお願いいたします。

発生している問題・エラーメッセージ

①基本情報
・マップコード、遊技金額に変な改行が入っている。
・新台と店休日の間に改行が入っている。
②機種情報
・機種名は、URLリンク情報から取得しているが、URLリンクがない機種があるためそれらの機種情報も取得したい。
・親エレメントを見つけてパチンコ、スロットの区別がつくようにスクレイピングしたい。
・機種ID 機種名 台数の並びにしたい。

上記問題を解決できればと思いネット情報を検索していますが、超初心者のため躓いている状況です。

該当のソースコード

python3
ソースコード
#①基本情報
python3

import requests from bs4 import BeautifulSoup import re if __name__ == "__main__": url = 'https://p-town.dmm.com/shops/tokyo/12670' r = requests.get(url) soup = BeautifulSoup(r.text, 'lxml') selector = 'body > div.o-layout > div > div.o-container > main > div:nth-child(2) > div > table' for table in soup.select(selector + ' th, td'): if table.attrs.get('class')[0] == 'th': th_text = table.getText() elif table.attrs.get('class')[0] == 'td': if table.find('p') is not None: td_text = table.p.getText() else: td_text = table.getText() print(th_text + ':' + td_text)

#②機種情報
python3

import re import requests from bs4 import BeautifulSoup if __name__ == "__main__": url = 'https://p-town.dmm.com/shops/aomori/1639' r = requests.get(url) soup = BeautifulSoup(r.text, 'lxml') items = soup.find_all("a", href=re.compile(r"/machines/\d+"), class_='link') for item in items: number = item.parent.next_sibling.next_element print('{0:>4} {1:>4} {2}'.format(item.attrs.get('href')[10:], number.text, item.text))

試したこと

上記問題を解決できればと思いネット情報を検索していますが、超初心者のため躓いている状況です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2019/03/05 08:32

コードは markdown 記法で記述してください (インデントがなくなってしまうため)
mather

2019/03/05 08:34

質問文のソースコードはMarkdownのコードブロックを使ってください。 とくにPythonの場合はインデントが変わると意味が変わってしまいます。
nasu0922

2019/03/05 08:52

ご指摘いただきありがとうございます。 markdown記法の修正方法についてご教授いただけないでしょうか。 質問以前の対応となり申し訳ありません。 よろしくお願いいたします。 よろしくお願いいたします。
nasu0922

2019/03/05 09:20

mather様、tiitoi様、ご指摘いただきありがとうございました。 内容を更新いたしました。
guest

回答1

0

ベストアンサー

①基本情報
・マップコード、遊技金額に変な改行が入っている。
・新台と店休日の間に改行が入っている。

HTML は汚いコードであることがほとんどであり、機械が読みやすいように作られていないため、必要な情報を取得するには、いらない文字を消したりするなど泥臭い処理をいろいろ書く必要があります。

python

1import re 2 3import requests 4from bs4 import BeautifulSoup 5 6url = 'https://p-town.dmm.com/shops/tokyo/12670' 7r = requests.get(url) 8soup = BeautifulSoup(r.content, 'lxml') 9 10data = {} 11for tr in soup.select('table[class="default-table"] tr'): 12 name = tr.th.text 13 14 if name == '住所': 15 value = tr.p.get_text(strip=True) 16 elif name == '新台': 17 items = [a.text.replace(' ', '') for a in tr.find_all('p')] 18 value = ''.join(items) 19 else: 20 value = tr.get_text(strip=True) 21 # 不要な文字削除 22 value = re.sub('[\u3000\n]', '', value) 23 data[name] = value 24 25from pprint import pprint 26pprint(data) 27
{'アクセス': 'アクセス-', 'マップコード': 'マップコード5 131 615*12「マップコード」および「MAPCODE」は㈱デンソーの登録商標です。', 'ルール詳細': 'ルール詳細抽選参加希望の方は9:30まで1階駐車場内に集合して下さい!', '住所': '東京都国分寺市東恋ケ窪5-6-3 東恋ケ窪SC1階・2階', '入場ルール': '入場ルール抽選', '台数': '台数パチンコ584台/スロット666台', '営業時間': '営業時間10:00~23:00', '定休日': '定休日無休', '整理券': '整理券--', '新台': '[4]パチヱヴァンゲリヲン~超暴走~[4]パチPFアクエリオンW最終決戦ver.', '特徴': '特徴大型無料駐車場616台、駐輪場769台、自動二輪駐車場103台完備', '遊技金額': '遊技金額4パチ:384台 1.25パチ:200台5スロ:102台 21.277スロ:564台', '電話番号': '電話番号042-320-4166', '駐車台数': '駐車台数616台'}

②機種情報
・機種名は、URLリンク情報から取得しているが、URLリンクがない機種がある> ためそれらの機種情報も取得したい。
・親エレメントを見つけてパチンコ、スロットの区別がつくようにスクレイピン> グしたい。
・機種ID 機種名 台数の並びにしたい。

python

1from urllib.parse import urljoin 2base_url = 'https://p-town.dmm.com' 3 4data = {} 5for ul in soup.select('ul[class="list-machinesettings"]'): 6 machine_type = 'パチ' 7 if 'パチ' in ul.h4.text: 8 machine_type = 'パチ' 9 elif 'スロ' in ul.h4.text: 10 machine_type = 'スロ' 11 12 machines = [] 13 for li in ul.select('li[class="item"]'): 14 name = li.select_one('div[class="text"]').get_text(strip=True) 15 num = li.select_one('div[class="number"]').get_text(strip=True) 16 link = urljoin(base_url, li.a['href']) if li.a else None 17 machines.append([name, num, link]) 18 data[machine_type] = machines 19 20pprint(data)
{'スロ': [['Re:ゼロから始める異世界生活', '6台', 'https://p-town.dmm.com/machines/3365'], ['アナザーハナビ弥生ちゃん', '2台', 'https://p-town.dmm.com/machines/3353'], ['マイジャグラーⅢ', '50台', 'https://p-town.dmm.com/machines/2180'], ['ミリオンゴッド-神々の凱旋-', '42台', 'https://p-town.dmm.com/machines/2102'], ['押忍!番長3', '28台', 'https://p-town.dmm.com/machines/2814'], ['ニューアイムジャグラーEXーKT', '26台', 'https://p-town.dmm.com/machines/1858'], ['パチスロディスクアップ', '25台', 'https://p-town.dmm.com/machines/3148'], ['バジリスク~甲賀忍法帖~絆', '19台', 'https://p-town.dmm.com/machines/1395'], ['HEY!鏡', '16台', 'https://p-town.dmm.com/machines/3249'], ... 'パチ': [['PFアクエリオンW最終決戦ver.', '8台', None], ['ヱヴァンゲリヲン~超暴走~', '8台', 'https://p-town.dmm.com/machines/3385'], ['PA設定付牙狼GOLDSTORM翔RH', '4台', 'https://p-town.dmm.com/machines/3368'], ['ぱちんこCRあしたのジョー(2019年)', '3台', 'https://p-town.dmm.com/machines/3355'], ['P リング呪縛RUSH FEX 設定付', '2台', 'https://p-town.dmm.com/machines/3371'],

投稿2019/03/05 09:48

tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nasu0922

2019/03/05 12:56

迅速なご回答ありがとうございました。 大変参考になりました。 少しずつステップアップしていきたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問