🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

Q&A

解決済

2回答

5877閲覧

Python:BeautifulSoupのfind().textで要素がない場合に別の文字を出力したい

m_osa

総合スコア4

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

0グッド

0クリップ

投稿2021/02/12 16:40

編集2021/02/13 02:28

前提・実現したいこと

pythonのbeautifulSoupでfind('aaaa').textを実行した際、find('aaaa')で要素がない場合には、「AttributeError: 'NoneType' object has no attribute 'text'」となってしまいますが、要素がない場合はこのエラーを発生させずに別の文字で出力したいと考えています。
そこで、lambda関数を組み合わせて、findで要素がない場合に返り値として文字列の'None'を返せないかとコードを記載したのですが、上手くデータが取得できません。
lambda関数を使わない方法でもよいので、何か方法はありませんでしょうか。
※普通にtry-exceptで回避する方法もあるかと思いますが、ロジックを汎用化したく、出来る限り簡潔なコードにしたいとも考えています。

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

問題は上記のとおりです。
また、該当のソースコードで出力される内容(result)は以下になります。

[<function Request.<locals>.<listcomp>.<lambda> at 0x000001E7FA7F1378>, <function Request.<locals>.<listcomp>.<lambda> at 0x000001E7FA7F1400>]
[<function Request.<locals>.<listcomp>.<lambda> at 0x000001E7FA7F1488>, <function Request.<locals>.<listcomp>.<lambda> at 0x000001E7FA7F1510>]
[<function Request.<locals>.<listcomp>.<lambda> at 0x000001E7FA7F1598>, <function Request.<locals>.<listcomp>.<lambda> at 0x000001E7FA7F1620>]

該当のソースコード

python

1soup = BeautifulSoup(response.text, 'html.parser') 2 3result = ([[lambda gro2 : gro2.find('aaaaa').text if gro2.find('aaaaa').text is not None else 'None',lambda gro3 : gro3.find('bbbbb').text if gro3.find('bbbbb').text is not None else 'None'] 4 for gro1 in soup.findAll('group1') 5 for gro2 in gro1.findAll('group2') 6 for gro3 in gro2.findAll('group3')]) 7

試したこと

find()関数の使い方で何か有効な手段はないかググってみましたが、特に見当たりませんでした。

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

Python3.7
Windows10

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

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

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

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

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

guest

回答2

0

ベストアンサー

普通に書くと、

Python

1result = gro2.find('aaaaa').text if gro2.find('aaaaa') else 'None'

投稿2021/02/13 03:20

otn

総合スコア85893

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

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

m_osa

2021/02/13 03:27

ありがとうございます!解消しました!
guest

0

if gro2.find('aaaaa').text is not None
ではなく
if gro2.find('aaaaa') is not None
ではダメですか?

投稿2021/02/12 17:41

takutakuya

総合スコア979

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

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

m_osa

2021/02/13 02:27

ご回答いただき、ありがとうございます。 確かにおっしゃる通り、上記部分に誤りがありました。 しかしながら、再処理をしても依然として「発生している問題・エラーメッセージ」で 記載している出力内容のままでした。せっかくご回答頂いたのに、申し訳ありません。
otn

2021/02/13 02:45

エラーじゃなくて、lambdaを返しているので、そのまま表示されているだけですね。 lambdaを書いた目的は??
m_osa

2021/02/13 02:58

ご確認いただき、ありがとうございます。 lambdaを書いた目的は、gro2.find('aaaaa').textと記載をすれば、通常データ取得は可能ですが、 find('aaaaa')で要素がない場合はNoneが返ってきてエラーとなってしまうため、それの回避策として ここでlambdaを書いて条件判定させれば、もしかしたら回避できるのではと考えたためです。 lambdaを使って何とか解決したいということではなく、このリスト内包表記の状態のままで、 この問題を解決することが出来ればどのような方法でも構わないと思っております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問