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

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

新規登録して質問してみよう
ただいま回答率
85.50%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

Q&A

解決済

1回答

2161閲覧

サイト内から特定データをWEBスクレイピングしたい。

nasu0922

総合スコア17

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Python 3.x

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

0グッド

0クリップ

投稿2019/04/10 05:15

編集2019/04/11 07:46

前提・実現したいこと

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

hall_infoに代入されないままprintなりに到達するケースがあると提示エラー発生します。

Python

1# hall_info = '' # とりあえず定義しておけばエラーは出ない。 2for i in range(2): 3 print(i) 4 if i % 2 == 0: 5 pass 6 else: 7 hall_info = i 8 9 print(hall_info) # NameError: name 'hall_info' is not defined

投稿2019/04/11 08:29

can110

総合スコア38234

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

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

nasu0922

2019/04/11 08:45

hall_info = value に代入しているのですが、それでもエラーが出ているためどう修正すればよいでしょうか。可能であれば、該当箇所をどう修正すればいいかご教授いただけると助かります。
can110

2019/04/11 10:25

一般的にはprintなりの参照前に変数を定義すればよいです。 回答コードで云えば、1行目のコメントアウトを外せばよいです。 質問コードにおいて具体的にどこをどのように修正すべきかは、処理内容によるのでご自身で判断下さい。
nasu0922

2019/04/12 00:04

上記の件、承知いたしました。こちらで判断し対応いたします。 ご返信いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問