Address
304 North Cardinal St.
Dorchester Center, MA 02124

Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM

Pythonのエラー「Compound class names not permitted」

Pythonエラー「InvalidSelectorException: Message: invalid selector: Compound class names not permitted」が出たときの対処法・解決方法

Pythonでseleniumを使ってWEBスクレイピングをするときに、エラーメッセージ「InvalidSelectorException: Message: invalid selector: Compound class names not permitted」が出たときに対処法

今回は私が陥ったPythonのエラーについての記事です。seleniumを使ってWEBスクレイピングのプログラムを作って実行するときに出会って困ったエラーの話です。

出現したPythonのエラー

上述のようにPythonでWEBスクレイピングをするときに定番のライブラリseleniumを使ってプログラムを組んで実行したわけですが、次のようなエラーメッセージが出ました。

InvalidSelectorException: Message: invalid selector: Compound class names not permitted

「class names」と書いてあるのでなんとなくHTMLのクラス名が変なのか?という予想はつきましたが、「Compound」というのがよくわかりません。

Compound class namesとは何か?判明したエラーの内容

そしてネットを検索して調べてみると、英語の記事で「seleniumでは、 Compound class namesは使えない」というのが発見できました。

では、Compound class namesとはなにかというと、HTMLのクラス属性で指定するクラス名の途中に空白(スペース)が使われているもののことのようです。次の例を見てください。

<button class="red_button">
<button class="blue_button">

これは2つのボタン要素にそれぞれ「red_button」と「blue_button」という2つのクラス名を指定したものです。

ですが、HTMLの仕様では1つのクラス属性に対して複数のクラス名を同時に指定できます。次のコードを見てください。

<button class="red_button blue_button">

2つのクラス名が、半角スペースを挟んで並んでいます。こういう書き方が可能です。

しかしPythonのseleniumは、この半角スペースによってクラス名が並んでいるものを処理できないというのが、今回のエラー「Compound class names」の意味するところだったのです。

解決方法:find_element_by_xpathを使いこなそう

seleniumによってWEBスクレイピングをするときによくあるのが、次のように「find_elements_by_class_name( )メソッド」を使って、クラス名によってHTMLの構造を取得・分類する方法だと思います。

driver.find_elements_by_class_name(クラス名)

しかし、これだと上述のような半角スペースによってクラス名が複数並べられている場合に「Compound class names」とエラーが出てしまいます。

原因はクラス名ですから、対処方法は「クラス名を使わないでWEBスクレイピングする」ということになります。

さて、seleniumは特定のHTML要素の情報を見つけるため以下のような複数のメソッドを用意してくれています。

  • find_element_by_id
  • find_element_by_class_name
  • find_element_by_name
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_css_selector
  • find_element_by_xpath

そして使いこなせれば最も強力で最も便利なのは、一番下の「find_element_by_xpath」メソッドです。

使い方は今回は書きませんが、私も今回出会った「Compound class names」エラーを解決するため、この「find_element_by_xpath」メソッドを使ってプログラムを書き直しました。そして無事に成功しました。

というわけで、seleniumを使って「Compound class names」というエラーがでた場合には、find_element_by_xpathメソッドを使ってプログラムを書き直すのがおすすめです。

愛を分かち合いましょう