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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9817questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 195

nasu0922

score 3

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

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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • nasu0922

    2019/03/05 17:52

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

    キャンセル

  • tiitoi

    2019/03/05 17:57

    質問欄を編集して、マークダウン記法のコードの記述を参考にコード部分を```で囲む。

    以下のページに説明があります。
    https://qiita.com/Qiita/items/c686397e4a0f4f11683d#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5

    キャンセル

  • nasu0922

    2019/03/05 18:20

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

    キャンセル

回答 1

checkベストアンサー

+1

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

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

import re

import requests
from bs4 import BeautifulSoup

url = 'https://p-town.dmm.com/shops/tokyo/12670'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')

data = {}
for tr in soup.select('table[class="default-table"] tr'):
    name = tr.th.text

    if name == '住所':
        value = tr.p.get_text(strip=True)
    elif name == '新台':
        items = [a.text.replace(' ', '') for a in tr.find_all('p')]
        value = ''.join(items)
    else:
        value = tr.get_text(strip=True)
    # 不要な文字削除
    value = re.sub('[\u3000\n]', '', value)
    data[name] = value

from pprint import pprint
pprint(data)
{'アクセス': 'アクセス-',
 'マップコード': 'マップコード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 機種名 台数の並びにしたい。

from urllib.parse import urljoin
base_url = 'https://p-town.dmm.com'

data = {}
for ul in soup.select('ul[class="list-machinesettings"]'):
    machine_type = 'パチ'
    if 'パチ' in ul.h4.text:
        machine_type = 'パチ'
    elif 'スロ' in ul.h4.text:
        machine_type = 'スロ'

    machines = []
    for li in ul.select('li[class="item"]'):
        name = li.select_one('div[class="text"]').get_text(strip=True)
        num = li.select_one('div[class="number"]').get_text(strip=True)
        link = urljoin(base_url, li.a['href']) if li.a else None
        machines.append([name, num, link])
    data[machine_type] = machines

pprint(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 21:56

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

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9817questions

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