1. ホーム
  2. python

[解決済み] EC.presence_of_element_located((By.ID, "myDynamicElement")) は、IDではなくクラスを指定する以外にどのように使用するのでしょうか?

2022-02-18 04:58:39

質問

Pythonを使って、HTMLを動的に読み込むウェブサイトをスクレイピングしようとしています。このウェブサイトには、HTMLに応答としてデータをレンダリングする埋め込みjavascriptファイルが使用されています。したがって、私がBeautifulSoupを単独で使用する場合、私のプログラムはJavascriptがデータをロードする前にそれをスクレイピングするので、私が必要とするデータを取得することはできません。そのため、seleniumライブラリをコードに組み込んで、ある要素が見つかるのを待ってからWebサイトをスクレイピングするようにしています。

もともとやっていたことです。

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID, "tabla_evolucion")))

しかし、代わりに次のような方法でクラスを指定したい。

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))  

以下は、私のコードの残りです。

driver_path = 'C:/webDrivers/chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.header_overrides = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
url = "myurlthatIamscraping.com" 
response = driver.get(url)
html = driver.page_source
characters = len(html)
element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))

print(html)
print(characters)
time.sleep(10)
driver.quit()

正しい構文がどこにも見当たりません。

どうすればいいですか?

関連するHTMLがあれば、より正規の回答を構築することができたはずです。しかし、最初の1行のコードから始める必要があります。

element = WebDriverWait(driver,100).until(EC.presence_of_element_located(
  (By.ID, "tabla_evolucion")))

は、2行目のコードとほぼ同じ場所です。

element = WebDriverWait(driver,100).until(EC.presence_of_element_located(
  (By.class, "ng-binding ng-scope")))

としてエラーを発生させます。

メッセージ:無効なセレクタです。複合クラス名は許可されていません

を介して複数のクラスを渡すことはできないので By.class .

に詳しい考察があります。 無効なセレクタです。Webdriver と Python で find_element_by_class_name を使用した複合クラス名の使用は許可されません。


解決方法

以下のように、いくつかの対処が必要です。

  • 使用例が見えない状態で、機能的に WebDriverWait との関連で EC として presence_of_element_located() の中に要素があることを確認するだけです。 DOMツリー . おそらくこの先には、例えば次のような属性を取得する必要があります。 value , innerText などと、その要素と対話することになります。ですから、代わりに presence_of_element_located() のどちらかを使用する必要があります。 visibility_of_element_located() または element_to_be_clickable()

に詳しい考察があります。 WebDriverWaitが期待通りに動作しない

  • 最適な結果を得るためには IDCLASS 属性があり、以下のいずれかを使用することができます。 ロケーターストラテジー :

  • 使用方法 CSS_SELECTOR :

  element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located(
    (By.CSS_SELECTOR, ".ng-binding.ng-scope#tabla_evolucion")))

  • 使用方法 XPATH :
  element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located(
    (By.XPATH, "//*[@class='ng-binding ng-scope' and @id='tabla_evolucion']")))