前提・実現したいこと
dmm.ぱちタウンから全パチンコホールをWEBスクレイピングしたいと考えています。
昨日投稿しましたが、丸投げのような内容になったため出来る範囲内で修正をしました。
しかしながらエラーが発生し解決できておりません。
初心者のためご教授いただきく存じます。
発生している問題・エラーメッセージ
・「NameError: name 'hall_info' is not defined」とエラーが発生しています。
・エラーが解消すれば問題なくスクレイピングできるか確認したい。
#コード
python3
1import requests 2import logging 3from bs4 import BeautifulSoup 4 5if __name__ == "__main__": 6 7 # フォーマットを定義 8 formatter = '%(asctime)s : %(levelname)s : %(message)s' 9 # ログレベルを DEBUG に変更 10 logging.basicConfig(format=formatter, filename='logger.log', level=logging.INFO) 11 12 base_url = 'https://p-town.dmm.com' 13 target_url = '/' 14 r = requests.get(base_url + target_url) #requestsを使って、webから取得 15 soup = BeautifulSoup(r.text, 'lxml') #要素を抽出 16 17 selector = 'body > div.o-layout > div > div.o-container > main > section.default-box.-shop > div > div li' 18 # 都道府県ループ 19 for elem1 in soup.select(selector): 20 string_ = elem1.text 21 target_url = elem1.next_element.attrs.get('href') 22 area_name = target_url.rsplit('/', 1)[1] 23 #print(area_name) 24 logging.info('%s %s', 'test:', string_ + ':' + base_url + target_url) 25 r = requests.get(base_url + target_url) 26 soup= BeautifulSoup(r.text, 'lxml') 27 selector = 'body > div.o-layout > div > div > main > section:nth-child(3) li' 28 num = 0 29 # 市区町村ループ 30 for elem2 in soup.select(selector): 31 target_url = elem2.next_element.attrs.get('href') 32 city_id = target_url.rsplit('/', 1)[1] 33 print(elem2.text + ':' + base_url + target_url) 34 logging.info('%s %s', 'test:', elem2.text + ':' + base_url + target_url) 35 r = requests.get(base_url + target_url) 36 soup = BeautifulSoup(r.text, 'lxml') 37 selector = 'body > div.o-layout > div > div.o-container > main > section li' 38 nextpage = True 39 while nextpage: 40 # 次ページ有無チェック 41 for elem3 in soup.select(selector): 42 if elem3.attrs.get('class')[0] == 'item': 43 if elem3.text == '>': 44 if elem3.next.attrs.get('href') is not None: 45 nextpage = True 46 break 47 else: 48 nextpage = False 49 # 登録ホールループ 50 for elem3 in soup.select(selector): 51 if elem3.attrs.get('class')[0] == 'unit': 52 # ホール情報収集 53 num += 1 54 target_url = elem3.next_element.attrs.get('href') 55 hall_id = target_url.rsplit('/', 1)[1] 56 r2 = requests.get(base_url + target_url) 57 soup2 = BeautifulSoup(r2.text, 'lxml') 58 # 店舗名取得 59 selector2 = 'body > div.o-layout > div > div.o-container > main > div:nth-child(1) > div > h1' 60 hall_name = soup2.select(selector2)[0].text 61 # 店舗基本情報取得 62 for tr in soup.select('table[class="default-table"] tr'): 63 name = tr.th.text 64 if name == '住所': 65 # 前後の空白文字を削除 strip=true 66 value = tr.p.get_text(strip=True) 67 elif name == '新台': 68 # 空白文字を削除 replace(置換する文字列, 置換される文字列) 69 items = [a.text.replace(' ', '') for a in tr.find_all('p')] 70 value = ''.join(items) 71 else: 72 value = tr.get_text(strip=True) 73 # 不要な文字削除 re.sub(正規表現, 置換する文字列, 置換される文字列) 74 value = re.sub('[\u3000\n]', '', value) 75 hall_info = value 76 print(str(num) + '[' + hall_id + ']:' + hall_name + ':' + hall_info ) 77 logging.info('%s %s', str(num) + '[' + hall_id + ']:' + hall_name + ':' + hall_info + ':', base_url + target_url) 78 79 # 次ページ読込、なければループ終了 80 elif elem3.attrs.get('class')[0] == 'item': 81 if elem3.text == '>': 82 #print(elem3.next.attrs.get('href')) 83 if elem3.next.attrs.get('href') is not None: 84 target_url = elem3.next.attrs.get('href') 85 r = requests.get(target_url) 86 soup = BeautifulSoup(r.text, 'lxml') 87 else: 88 nextpage = False 89 break 90
試したこと
Name errorのため該当箇所の名前を確認しましたが、特に問題ありませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/11 08:45
2019/04/11 10:25
2019/04/12 00:04