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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

427閲覧

try文の中だけでなく、except文のなかも一つのインデックスとして扱われるようにしたい。

loulou098

総合スコア15

スクレイピング

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/05/17 23:08

編集2023/05/17 23:13

実現したいこと

求人サイトから、企業名、電話番号、住所を出力するコードを書いているのですが、求人の掲載期間終了により、出力結果がNoneとなった部分(except文のところ)も一つのインデックスとして使われ、csvファイルとして出力されるようにしたいです。

前提

出力結果が

720 ============================== 0 ============================== {'company_name': '住宅型有料老人ホーム\u3000いこいの里\u3000古賀', 'address': '福岡県古賀市今の庄2丁目15番10号', 'tell_number': '092-943-6677'} HTTP error occurred: 404 Client Error: Not Found for url: https://atsumaru.jp/area/detail?kno=X109214&said=7&shn=980&vol=00001 None ============================== 2 ============================== {'company_name': '住宅型有料老人ホーム\u3000いこいの里\u3000糸島', 'address': '福岡県糸島市荻浦5丁目10番1号', 'tell_number': '092-330-7700'} ============================== 3 ============================== {'company_name': '結婚成立所ベルバンク', 'address': '福岡市博多区博多駅東1丁目1−28 ウェル博多ビル9F', 'tell_number': '092-260-7033'} ============================== 4 ============================== {'company_name': '東海工業㈱\u3000大野城営業所', 'address': '大野城市仲畑3丁目11-8', 'tell_number': '0120-680-343'} ============================== 5 ============================== {'company_name': '株式会社 西原商店\u3000「イオンモール福岡出張所」', 'address': '福岡県糟屋郡粕屋町大字酒殿192-1(イオンモール福岡)', 'tell_number': '096-378-0657'} ============================== 6 ============================== {'company_name': '住宅型有料老人ホーム\u3000いこいの里\u3000糸島', 'address': '福岡県糸島市荻浦5丁目10番1号', 'tell_number': '092-330-7700'} ============================== 7 ============================== {'company_name': 'ベルバンク株式会社', 'address': '福岡県三潴郡大木町大角1615-3-101', 'tell_number': '090-2339-4659'} ============================== 8 ============================== {'company_name': 'ベルバンク株式会社', 'address': '広島県広島市南区京橋町7-18\u3000新井ビル303号', 'tell_number': '092-260-7033'} ============================== 9 ============================== {'company_name': 'ベルバンク株式会社', 'address': '福岡県福岡市博多区博多駅東1丁目1-28 ウェル博多ビル 9F', 'tell_number': '092-260-7033'} ============================== 10 ============================== {'company_name': '環境筑紫株式会社', 'address': '筑紫野市二日市北5丁目7番10号', 'tell_number': '092-919-8730'} ============================== 11 ============================== {'company_name': 'フロンタル株式会社', 'address': '福岡県糟屋郡須恵町佐谷995-1', 'tell_number': '092-692-8202'}

となるのですが、

============================== 0 ============================== {'company_name': '住宅型有料老人ホーム\u3000いこいの里\u3000古賀', 'address': '福岡県古賀市今の庄2丁目15番10号', 'tell_number': '092-943-6677'} HTTP error occurred: 404 Client Error: Not Found for url: https://atsumaru.jp/area/detail?kno=X109214&said=7&shn=980&vol=00001 None

の部分を、

============================== 0 ============================== {'company_name': '住宅型有料老人ホーム\u3000いこいの里\u3000古賀', 'address': '福岡県古賀市今の庄2丁目15番10号', 'tell_number': '092-943-6677'} ============================== 1 ============================== HTTP error occurred: 404 Client Error: Not Found for url: https://atsumaru.jp/area/detail?kno=X109214&said=7&shn=980&vol=00001 None

としたいです。
どのようにコードを修正すればできるでしょうか?

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

エラーは発生していません。

該当のソースコード

Python

1#HTMLを読み込む 2with open('company_list.html', 'r') as f: 3 html = f.read() 4 5d_list = [] 6#HTMLを解析する 7soup = BeautifulSoup(html, 'lxml') 8 9 10cp_pages = soup.select('div#jobLists div#jobList.jobList > div h2 a') 11 12print(len(cp_pages)) 13for i, cp_page in enumerate(cp_pages): 14 company_name = cp_page.text#get cp_name 15 16 17 job_info_url = cp_page.get('href') if cp_pages else None 18 cp_page_url = 'https://atsumaru.jp' + job_info_url # 求人詳細ページのurl取得 19 20 try: 21 22 page_r = requests.get(cp_page_url) 23 page_r.raise_for_status() 24 page_soup = BeautifulSoup(page_r.content, 'lxml') 25 26 27 addresses = page_soup.select('div.bl_card2_table.bl_card2_table__wide th:-soup-contains("住所")') 28 addresses = page_soup.select('tr:has(th:-soup-contains("住所")) td p:first-child') 29 for address in addresses: 30 address_s = address.text 31 32 tell_nums = page_soup.select('div.telNo a') 33 for tell_num in tell_nums: 34 tell_number = tell_num.text 35 36 d_list.append({ 37 'company_name':cp_page.text, 38 'address':address.text, 39 'tell_number':tell_num.text 40 }) 41 print('='*30, i, '='*30) 42 print(d_list[-1]) 43 44 if i > 10: 45 break 46 47 except requests.exceptions.HTTPError as err: 48 print(f'HTTP error occurred: {err}') # Not Found, etc. 49 print('None') 50 51df = pd.DataFrame(d_list) 52df.to_csv('atsumaru_company_list.csv', index=None, encoding='utf-8-sig') 53

試したこと

except requests.exceptions.HTTPError as err: print(f'HTTP error occurred: {err}') # Not Found, etc. print('None')

のprint('None')の下に、print('='*30, i, '='*30)を記載したが

============================== 0 ============================== {'company_name': '住宅型有料老人ホーム\u3000いこいの里\u3000古賀', 'address': '福岡県古賀市今の庄2丁目15番10号', 'tell_number': '092-943-6677'} HTTP error occurred: 404 Client Error: Not Found for url: https://atsumaru.jp/area/detail?kno=X109214&said=7&shn=980&vol=00001 None ============================== 1 ==============================

となった。

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

Pythonのバージョン:3.10.9

使用PC:Intel MacBook

バージョン:macOS Monterey Version 12.4

実装環境:Jupyter Lab

Chromeのバージョン:112.0.5615.137

ChromeDriverのバージョン:112.0.5615.49

selenium 4.9.0

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

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

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

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

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

1T2R3M4

2023/05/18 00:18

csv化している目的は何でしょうか。 利用規約を遵守している内容でしょうか。
bsdfan

2023/05/18 14:40

実現したいことにはcsvファイルの出力について書かれていますが、それ以外の部分では標準出力(print)について書かれています。やりたいこと(希望のアウトプット)を明確にしてください。
loulou098

2023/05/18 21:57

csv化している目的は練習としてやっています。 利用規約は遵守しています。
guest

回答1

0

python

1for i, cp_page in enumerate(cp_pages): 2 print('='*30, i, '='*30) # ここに持ってくる 3 # 省略

投稿2023/05/17 23:14

ozwk

総合スコア13551

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

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

loulou098

2023/05/18 21:58

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問