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

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

ただいまの
回答率

88.31%

Python Seleniumでエラーが出る

受付中

回答 3

投稿

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

Kota.Y

score 24

YouTubeのコメントを一括削除するコードを書いているのですが、ループの部分で

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

というエラーが出ました。押下する要素をボタンの親にするなど対策してみたものの効果がありません。解決策が分かる方は教えていただきたいです。

ソースコード

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import chromedriver_binary
import time
from selenium.common.exceptions import NoSuchElementException

wait_time = 30

# 画面遷移関数
url = "https://www.youtube.com/feed/history/comment_history"


def page_move(url):
    WebDriverWait(driver, wait_time).until(
        EC.presence_of_element_located((By.XPATH, url))
    )


def insert_pw(xpath, str):
    driver.find_element_by_xpath(xpath).send_keys(str)


def click(xpath):
    driver.find_element_by_xpath(xpath).click()


# YouTubeコメントページに移動
driver = webdriver.Chrome()
driver.implicitly_wait(1)
driver.get(url)

# YouTubeログインページに移動
login_button = '/html/body/ytd-app/div/div/ytd-masthead/div[3]/div[3]/div[2]/ytd-button-renderer/a/paper-button'
click(login_button)

time.sleep(1)

# Googleログイン
# ID入力
login_id = "hogehogehogehoge@gmail.com"
login_id_xpath = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div/div[1]/div/div[1]/input'
login_id_button = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div/div'
insert_pw(login_id_xpath, login_id)
click(login_id_button)

time.sleep(1)

# パスワード入力
login_pw = "hoge1234"
login_pw_xpath = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[1]/div/form/span/section/div/div/div[1]/div[1]/div/div/div/div/div[1]/div/div[1]/input'
login_pw_button = '/html/body/div[1]/div[1]/div[2]/div/div[2]/div/div/div[2]/div/div[2]/div/div[1]/div/div'
insert_pw(login_pw_xpath, login_pw)
time.sleep(1)
click(login_pw_button)

time.sleep(3)

comment_div = '/html/body/ytd-app/div/ytd-page-manager/ytd-browse/ytd-two-column-browse-results-renderer/div[1]/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]'
num_of_comments = driver.find_element_by_xpath(comment_div)
print(num_of_comments)

for num in range(100):
    menu_bar = '/html/body/ytd-app/div/ytd-page-manager/ytd-browse/ytd-two-column-browse-results-renderer/div[1]/ytd-section-list-renderer/div[2]/ytd-item-section-renderer/div[3]/ytd-comment-history-entry-renderer[1]/div[2]/ytd-menu-renderer'
    time.sleep(1)
    click(menu_bar)
    time.sleep(1)
    delete_button = '/html/body/ytd-app/ytd-popup-container/iron-dropdown/div/ytd-menu-popup-renderer/paper-listbox/ytd-menu-navigation-item-renderer[2]'
    delete_button_alt = '/html/body/ytd-app/ytd-popup-container/iron-dropdown/div/ytd-menu-popup-renderer/paper-listbox/ytd-menu-navigation-item-renderer'
    try:
        driver.find_element_by_xpath(delete_button)
    except NoSuchElementException:
        delete_button = delete_button_alt
    click(delete_button)
    delete_confirm = '/html/body/ytd-app/ytd-popup-container/paper-dialog/yt-confirm-dialog-renderer/div[2]/div/yt-button-renderer[2]/a/paper-button'
    delete_button_alt = '/html/body/ytd-app/ytd-popup-container/paper-dialog/yt-confirm-dialog-renderer/div[2]/div/yt-button-renderer[2]/a/paper-button'
    click(delete_confirm)
    time.sleep(1)

driver.close()
driver.quit()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

0

どのクリックでのエラーかわかりませんが、その箇所でdriver.find_element_by_xpath(xpath)で得られた要素が本当に目的のノードかを確認するのでしょうか。

XPathが「何番目のdiv」とかの指定なので、非常に危うい感じです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

短絡的かつ強引な手段ですが以下に変更してみるのはどうでしょう。

def click(xpath):
    driver.execute_script('document.evaluate(' + xpath + ', document, null, 7, null).snapshotItem(0).click();')

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

XPathは絶対XPathのほうがいいと思います。
xpathの書き方なら、下記の記事をご参照ください。
お役に立てれば幸いです。
XPathとは?基本概念や書き方をわかりやすく解説!

またYouTubeのコメントをスクレイピングしたいなら、Octoparseはそのようなテンプレートを提供しています。
https://service.octoparse.com/ja-jp/web-scraping-template

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

同じタグがついた質問を見る