私の問題は一般的な問題です。中間の属性ルックアップの1つが返される可能性がある場合に、一連の属性ルックアップをチェーンする方法ですがNone
、Beautiful Soupを使用しようとしてこの問題に遭遇したので、そのコンテキストで質問します。
Beautiful SoupはHTMLドキュメントを解析し、そのドキュメントの構造化されたコンテンツにアクセスするために使用できるオブジェクトを返します。たとえば、解析されたドキュメントが変数にある場合、次のsoup
ようにタイトルを取得できます。
title = soup.head.title.string
私の問題は、ドキュメントにタイトルがない場合にsoup.head.title
戻りNone
、その後のstring
ルックアップで例外がスローされることです。私はチェーンを次のように分割することができます:
x = soup.head
x = x.title if x else None
title = x.string if x else None
しかし、これは私の目には冗長で読みにくいものです。
私は書くことができます:
title = soup.head and soup.head.title and soup.title.head.string
しかし、それは冗長で非効率的です。
考えられる場合の1つの解決策は、可能だと思いますが、属性ルックアップに対してnil
返されるオブジェクト(それを呼び出す)を作成することです。None
これは私が書くことを可能にするでしょう:
title = ((soup.head or nil).title or nil).string
しかし、これはかなり醜いです。もっと良い方法はありますか?