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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

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

Q&A

1回答

258閲覧

python スクレイピング 'NoneType' object has no attribute 'text'について

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2023/06/10 09:51

編集2023/06/10 09:57

参考にしているサイト(qiita)でスクレイピングの学習を行っております。
以下のコードを実行すると、AttributeError: 'NoneType' object has no attribute 'text'となり、Noneが返ってきて
情報の取得ができない状況です。

参考にしているサイト(qiita)では、しっかりと、text部分だけ
情報の取得ができておりますが、私の記載したコードでは、上記で記載しましたとおり、Noneとなってしまいます。
原因等お分かりの方、ご教示いただければと思います。

python

1変数titleに、物件名を格納する 2title = detail.find('div', class_='cassetteitem_content-title').text 3変数addressに住所を格納する 4address = detail.find('li', class_='cassetteitem_detail-col1').text 5変数accessにアクセス情報を格納する 6access = detail.find('li', class_='cassetteitem_detail-col2').text 7変数ageに築年数を格納する 8age = detail.find('li', class_='cassetteitem_detail-col3').text 9

私が書いたコード

python

1import requests 2from bs4 import BeautifulSoup 3 4 5url = 'https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13104&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=3&page={}' 6target_url = url.format(1) 7 8 9r = requests.get(target_url) 10soup = BeautifulSoup(r.text, "html.parser") 11 12contents = soup.find_all('div', class_='cassetteitem') 13 14content = contents[0] 15 16# 物件情報取得 17detail = content.find('div', class_='cassetteitem-item') 18 19# 各部屋の情報取得 20table = content.find('table', class_='cassetteitem_other') 21 22 23# 物件名 24title = detail.find('div', class_='cassetteitem_content-title').text 25# 住所 26address = detail.find('li', class_='cassetteitem_detail-col1').text 27# 場所 28access = detail.find('li', class_='cassetteitem_detail-col2').text 29# 築年数 30age = detail.find('li', class_='cassetteitem_detail-col3').text 31 32print(title, address, access, age)

HTML構造
イメージ説明

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

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

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

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

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

melian

2023/06/10 10:11

HTML ソースコードを眺めてみると、 detail = content.find('div', class_='cassetteitem-item') ではなくて、 detail = content.find('div', class_='cassetteitem-detail') ではないでしょうか。
退会済みユーザー

退会済みユーザー

2023/06/10 12:33

有難うございます。無事解決できました。
guest

回答1

0

HTML構造が読めていないのでは?

cassetteitemの下に、

cassetteitem_content-title:物件名
cassetteitem_detail-col1:住所
cassetteitem_detail-col2:場所アクセス
cassetteitem_detail-col3:築年数

という明細が繰り返されてるだけみたいだから、下のコードでとれるはず。

(try~exceptは要素がないとき用)

import requests from bs4 import BeautifulSoup url = 'https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=13&sc=13104&cb=0.0&ct=9999999&et=9999999&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=3&page={}' target_url = url.format(1) r = requests.get(target_url) soup = BeautifulSoup(r.text, "html.parser") contents = soup.find_all('div', class_='cassetteitem') for i,content in enumerate(contents): print(i+1) try: # 物件名 title = content.find('div', class_='cassetteitem_content-title').text # 住所 address = content.find('li', class_='cassetteitem_detail-col1').text # 場所 access = content.find('li', class_='cassetteitem_detail-col2').text # 築年数 age = content.find('li', class_='cassetteitem_detail-col3').text print(f"物件名:{title}\n\n住所:{address}\n\nアクセス:{access}\n築年数:{age}") except AttributeError: print("error!!!!") pass

投稿2023/06/10 10:31

編集2023/06/10 10:32
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問