Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
Address
304 North Cardinal St.
Dorchester Center, MA 02124
Work Hours
Monday to Friday: 7AM - 7PM
Weekend: 10AM - 5PM
今回は私が陥ったPythonのエラーについての記事です。seleniumを使ってWEBスクレイピングのプログラムを作って実行するときに出会って困ったエラーの話です。
上述のようにPythonでWEBスクレイピングをするときに定番のライブラリseleniumを使ってプログラムを組んで実行したわけですが、次のようなエラーメッセージが出ました。
InvalidSelectorException: Message: invalid selector: Compound class names not permitted
「class names」と書いてあるのでなんとなくHTMLのクラス名が変なのか?という予想はつきましたが、「Compound」というのがよくわかりません。
そしてネットを検索して調べてみると、英語の記事で「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」の意味するところだったのです。
seleniumによってWEBスクレイピングをするときによくあるのが、次のように「find_elements_by_class_name( )メソッド」を使って、クラス名によってHTMLの構造を取得・分類する方法だと思います。
driver.find_elements_by_class_name(クラス名)
しかし、これだと上述のような半角スペースによってクラス名が複数並べられている場合に「Compound class names」とエラーが出てしまいます。
原因はクラス名ですから、対処方法は「クラス名を使わないでWEBスクレイピングする」ということになります。
さて、seleniumは特定のHTML要素の情報を見つけるため以下のような複数のメソッドを用意してくれています。
そして使いこなせれば最も強力で最も便利なのは、一番下の「find_element_by_xpath」メソッドです。
使い方は今回は書きませんが、私も今回出会った「Compound class names」エラーを解決するため、この「find_element_by_xpath」メソッドを使ってプログラムを書き直しました。そして無事に成功しました。
というわけで、seleniumを使って「Compound class names」というエラーがでた場合には、find_element_by_xpathメソッドを使ってプログラムを書き直すのがおすすめです。