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

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

ただいまの
回答率

89.09%

Python3.7 で win32com.client から取得した HTMLObject の getElement 系メソッドでエラーが発生する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 91

busyoda

score 34

下記プログラムの実行時に後述のエラーが発生します。
エラーの解消方法についてご教示をお願いいたします。

情報が不足しておりましたら、
どういった情報が必要であるかご指摘下さい。

言語: Python3.7
環境: Windows10 64bit / Visual Studio 2019

【ソースコード】
import time
import win32com.client

ie = win32com.client.Dispatch("InternetExplorer.Application")
ie.visible = True
ie.Navigate("https://www.google.co.jp")

while(ie.Busy and ie.ReadyState != 4):
time.sleep(1)

col = ie.document.all
elem = ie.Document.getElementById("gsr")

【エラー箇所】
elem = ie.Document.getElementById("gsr")

【エラー内容】
ハンドルされていない例外
Message=getElementById() takes 1 positional argument but 2 were given
Source=C:\Users\sample.py
スタック トレース:
File "C:\Users\sample.py", line 12, in <module>
elem = ie.Document.getElementById("gsr")

【試したこと】
1.エラー文面通り、引数を減らして(渡さずに)実行する。
結果、以下事象が発生しました。

①Visual Studio で「^ScriptDocument1 _COMObject _unknown__.txt」というファイルが開く。
②開かれたファイルでエラーが発生する。

【開かれたファイルの内容】
1行目 空白
2行目 LOAD_FAST(self), LOAD_METHOD(_ApplyTypes_), LOAD_CONST(3001611), LOAD_CONST(1), LOAD_CONST((12, 0)), LOAD_CONST(()), LOAD_CONST('getElementById'), LOAD_CONST(None), CALL_METHOD{6}, RETURN_VALUE
3行目 空白

【エラー箇所】
開かれたファイルの2行目

【エラー内容】
Message=(-2147352319, 'OLE error 0x80020101', None, None)
Source=<COMObject <unknown>>
スタック トレース:
File "<COMObject <unknown>>", line 2, in getElementById
File "C:\Users\sample.py", line 12, in <module>
elem = ie.Document.getElementById()

2.引数を2つ渡す。
予想通りでしたが、同じ箇所でほぼ同じエラーが発生します。
相違点は but 2 were given が but 3 were given となる点です。

3.引数で渡す id を変更する。
上記ソースコードに記載の gsr 以外の、 google.com に存在する id を渡して実行してみましたが、
同じ箇所で同じエラーが発生します。
 
ちなみに、エラー箇所直前の document.all が正常に取得できているので、
存在するエレメントの id 一覧は取得できます。

4.pywin32 のバージョンを確認する。
getElementsById の定義で引数に self を設定しなければ上記エラーが発生するはずなので、
import されているモジュール自体に問題がある可能性を考え、
現在のバージョンの確認と、 pip install pywin32 --upgrade を実行しました。

結果、現在のバージョンは最新と思われる 228 であり、 --upgrade の後も228 のままでした。

5.getElementById を他のメソッドに変更する。
取り敢えず getElement と名の付くメソッドを思いつく限り実行しましたが、
すべて同様の箇所で同様のエラーが発生します。

色々なサイトを拝見しましたが、エラーの原因が特定できません。
どうかご助力をお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

stack overflowにそのものズバリの回答がありました。

getElementByIdはwin32comによって動的に作られるそうです(COMらしい動作ですね)。回避方法は「正常にに動作するウェブサイトに一旦接続し、その後正常に動作しないウェブサイトに接続する」事だそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/01 02:06

    ご回答ありがとうございます。

    ご提示頂いたサイトの質問内容は何度か拝見しておりましたが、
    私が最初に確認したサイトでは1つ目の回答のみが表示されており、
    その回答では解消策や原因については深く触れられていなかった為、
    その後は同じ質問が掲載されていたサイトは読み飛ばしておりました。

    大変失礼いたしました。
    後程、改めてじっくりと拝見させて頂きます。

    動的に作られるとのことで、エラー箇所の深追いが出来なかったのも納得がいきました。

    一旦正常な document を渡せば良いらしいので、
    ローカルで自作の html を渡す、などでも対応できるかもしれません。

    また、document.body からなら実行できる?様な回答もあったので、
    その辺りも含めて引き続き検証をしてまいります。

    本当にありがとうございました。

    キャンセル

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

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる