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

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

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

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

Python

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

Q&A

解決済

2回答

696閲覧

BeautifulSoupを用いたスクレイピング

tanusan

総合スコア3

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/05/27 08:27

前提・実現したいこと

tabletag から全てのtrタグを取り出したい

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

'NoneType' object has no attribute 'find_all'

該当のソースコード

Python3

1import requests 2from bs4 import BeautifulSoup 3 4url = "https://www.jalan.net/270000/LRG_272000/?stayYear=&stayMonth=&stayDay=&dateUndecided=1&stayCount=1&roomCount=1&adultNum=2&ypFlg=1&kenCd=270000&screenId=UWW1380&roomCrack=200000&lrgCd=272000&distCd=01&rootCd=04/page{}#" 5target_url = url.format(1) 6r = requests.get(target_url) 7soup = BeautifulSoup(r.content, "html.parser") 8 9d_list = [] 10products = soup.find_all("div", class_="p-yadoCassette__body p-searchResultItem__body") 11for product in products: 12 row = product.find("div", class_="p-yadoCassette__summary p-searchResultItem__summary") 13 table = product.find("table", class_="p-planTable p-searchResultItem__planTable") 14 15 name = row.find("h2", class_="p-searchResultItem__facilityName").text 16 17 tr_tags = table.find_all("tr")[1:3] 18 for tr_tag in tr_tags: 19 point_info,per,total = tr_tag.find_all("td") 20 21 point = point_info.find("li", class_="c-label c-label--orange p-searchResultItem__horizontalLabel overwritePointLabel") 22 perfee = per.find("span") 23 totalfee = total.find("span") 24 25 d = { 26 "name":name, 27 "point":point.text, 28 "perfee":perfee.text, 29 "totalfee":totalfee.text 30 } 31

試したこと

tableの中身などを確認してみたのですが、tdタグが複数あるのに対して取り出せない。

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

Python 3.9.0

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

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

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

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

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

ikapy

2021/05/27 08:39

find_allは、何ケ所もありますがどの行でエラーになったのか記入願います。
tanusan

2021/05/27 08:41

失礼しました。tr_tags = table.find_all("tr")[1:3]こちらの行になります。
ikapy

2021/05/27 09:07

「table = product.find("table", class_="p-planTable p-searchResultItem__planTable") 」で table がNoneなのですね。 find_allは見つからなかった場合、「[]」が返ってくるので、おかしいと思っていたのですが、元々がNoneなら納得です。ppaulさんの通りです。 蛇足ですが tableタグは、pandasのto_csvが便利です(tableだから)。
guest

回答2

0

for product in products:

で、たとえば最初のループではproductはproducts[0]です。
その場合にはproductの中に"table"はないのでtableはNoneとなります。
それに対して、find_allを行えば
'NoneType' object has no attribute 'find_all'
になります。

tableがNoneの場合はスキップするようにifで判定しましょう。

投稿2021/05/27 08:41

ppaul

総合スコア24666

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

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

tanusan

2021/05/27 09:06

ご回答ありがとうございます。 エラーの内容まで詳しく教えていただきありがとうございました。
guest

0

ベストアンサー

どうなっているか

まず、

'NoneType' object has no attribute 'find_all'

なので、find_allメソッドを実行しようとしている要素のどこかがNoneになってしまっているのでこれを解決する必要があります。
コード内でfind_allを実行しているのは2箇所ですが、そのうち1回目のproductsを取り出す元となるsoupは、requestsで取ってきたコンテンツ全体なのでNoneには基本的になりません。

コード内の条件でproductsをリストとして取得して、ループ内でそれぞれtableproduct.findで取り出そうとしているのですが、ここでNoneが含まれている可能性があります。

取得元URLを見ると最初の2件の宿がPRによる表示となっています。
この項目の中身を確認すると、tableタグはp-planTable p-searchResultItem__planTable p-searchResultItem__planTable--prというクラスが指定されています。

このため、元のコードである

python

1 table = product.find("table", class_="p-planTable p-searchResultItem__planTable")

では、

  • PR対象の宿のtableを見つけられず、findNoneを返す
  • その先でNoneに対するfind_allを実行しようとしてエラーになる

となってます。

どうするか

次のような対処が必要です。

  • PR宿を無視したいなら => Noneか判定して必要に応じてスキップする
  • PR宿を含めたいなら => tableの取り出し条件を緩めるか、Noneだった際に取り直す

投稿2021/05/27 08:46

attakei

総合スコア2738

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

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

tanusan

2021/05/27 09:05

ご回答ありがとうございます。 わかりやすくなぜエラーが起きてるのかというところから教えていただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問