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

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

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

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

Python

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

Q&A

1回答

213閲覧

python で医者情報をスクレイピングしたい

takuro1111

総合スコア0

スクレイピング

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

Python

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

0グッド

0クリップ

投稿2024/04/10 05:34

実現したいこと

https://hospital.fujita-hu.ac.jp/
上記のサイトの診療科ページにある医者情報をスクレイピングしたい。
診療科をクリックして、その下に医者紹介ページがあります。
なので、診療科ごとのページまで遷移し、医者の情報をスクレイピングする必要があります。
https://hospital.fujita-hu.ac.jp/department/emergency-general-staff.html

発生している問題・分からないこと

実行してもエラーは発生しないのですが、情報を取得できないです。
空のCSVが出力されてしまう

該当のソースコード

python

1import requests 2from bs4 import BeautifulSoup 3 4# 藤田医科大学病院のウェブサイトのURLを指定 5url = "https://hospital.fujita-hu.ac.jp" 6 7# ウェブページを取得 8response = requests.get(url) 9html_content = response.content 10 11# BeautifulSoupを使ってHTMLを解析 12soup = BeautifulSoup(html_content, "html.parser") 13 14# 各診療科のページのリンクを取得 15department_links = soup.find_all("a", {"class": "department-link"}) 16 17# 医師情報を格納するリスト 18doctors = [] 19 20# 各診療科のページを順に処理 21for link in department_links: 22 department_url = url + link["href"] 23 department_response = requests.get(department_url) 24 department_soup = BeautifulSoup(department_response.content, "html.parser") 25 26 # 医師紹介ページのリンクを取得 27 doctor_links = department_soup.find_all("a", {"class": "doctor-link"}) 28 29 # 各医師ページを処理 30 for doctor_link in doctor_links: 31 doctor_url = url + doctor_link["href"] 32 doctor_response = requests.get(doctor_url) 33 doctor_soup = BeautifulSoup(doctor_response.content, "html.parser") 34 35 # 医師の情報を抽出 36 name = doctor_soup.find("h2", {"class": "doctor-name"}).text.strip() 37 specialty = doctor_soup.find("div", {"class": "doctor-specialty"}).text.strip() 38 qualifications = doctor_soup.find_all("div", {"class": "doctor-qualification"}) 39 40 # 医師の情報をリストに追加 41 doctor_info = { 42 "name": name, 43 "specialty": specialty, 44 "qualifications": [q.text.strip() for q in qualifications] 45 } 46 doctors.append(doctor_info) 47 48# 医師情報をCSVファイルに出力 49import csv 50with open("doctors.csv", "w", newline="", encoding="utf-8") as csvfile: 51 fieldnames = ["name", "specialty", "qualifications"] 52 writer = csv.DictWriter(csvfile, fieldnames=fieldnames) 53 writer.writeheader() 54 for doctor in doctors: 55 writer.writerow(doctor)

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

調べてみても情報を取得できない

補足

特になし

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

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

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

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

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

melian

2024/04/10 06:22

# 各診療科のページのリンクを取得 department_links = soup.find_all("a", {"class": "department-link"}) department-link クラスの a 要素が存在しないので department_links が空リストになります。そのため、以降のループ処理が実行されずに医師情報を格納するリスト doctor も空リストのままになっています。
YT0014

2024/04/10 06:50

スクレイピングすることが、当該サイトのサイトポリシーに反しているように思えますが、許可は得ておらえるのでしょうか? https://hospital.fujita-hu.ac.jp/site-policy.html 「これらコンテンツ(文章、図画、写真、各種データ等)は、日本の著作権法、条約および他国の著作権法にいう著作権により保護されており、私的利用の範囲を超えて利用することはできず、また、権利者の許可なく改変、複製、賃貸、貸与、販売、出版、送信、放送等、方法の如何を問わず第三者の利用に供することを固く禁じます。ただし、個々の著作物に個別の利用条件が付されている場合は、当該条件が優先されます。」
guest

回答1

0

やって良いことか悪いことか、一度考えてみるのはいかがですか?

参考: サイトポリシー | 藤田医科大学病院

投稿2024/04/10 11:37

Refrain

総合スコア532

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問