

**実行環境**  
windows10  
python3  
jupyterlab

**前提・実現したいこと**

ツイキャスのランキングから配信者の名前とtwitterのリンクをseleniumを使用し  
スクレイピングしたいと考えています。

xpathの一部を変えてループをしようとした段階でエラーが起きてしまいました。

**実際のコード**

[code]

    from time import sleep
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    from selenium.webdriver.chrome.options import Options
    browser = webdriver.Chrome(ChromeDriverManager().install()) #ブラウザを立ち上げる
    url = 'https://twitcasting.tv/rankingindex.php'
    browser.get(url) #指定のurlに移動
    
    sleep(3)
    elems_name = browser.find_elements_by_class_name("tw-ranking-username") #指定のクラスを取得
    keys = []
    for elem_name in elems_name:
        key = elem_name.text #クラスの中身をテキストで順に取得
        keys.append(key)     #keysに格納
    print(keys)
    sleep(3)
    Turls = []
    for i in range(100):
        urls = browser.find_element_by_xpath('//*[@id="rankbox_like"]/div/div[1 + i]/div[2]/div[1]/div[1]/a').get_attribute('href') #xPath変化あり
        browser.get(urls)
        url1 = browser.find_element_by_xpath('//*[@id="mainwrapper"]/div[2]/div/div[11]/div/div[3]/div[2]/a[1]').get_attribute('href') #xPath変化なし
        browser.get(url1)
    
        Turl = browser.current_url#twitterURL取得
        Turls.append(Turl)
        sleep(3)
        browser.get(url) #元に戻る
    
[/code]

**エラー内容**

[code]

    ---------------------------------------------------------------------------
    NoSuchElementException                    Traceback (most recent call last)
    <ipython-input-3-3ea53e55222f> in <module>
         17 Turls = []
         18 for i in range(100):
    ---> 19     urls = browser.find_element_by_xpath('//*[@id="rankbox_like"]/div/div[1 + i]/div[2]/div[1]/div[1]/a').get_attribute('href') #xPath変化あり
         20     browser.get(urls)
         21     url1 = browser.find_element_by_xpath('//*[@id="mainwrapper"]/div[2]/div/div[11]/div/div[3]/div[2]/a[1]').get_attribute('href') #xPath変化なし
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element_by_xpath(self, xpath)
        392             element = driver.find_element_by_xpath('//div/td[1]')
        393         """
    --> 394         return self.find_element(by=By.XPATH, value=xpath)
        395 
        396     def find_elements_by_xpath(self, xpath):
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value)
        974                 by = By.CSS_SELECTOR
        975                 value = '[name="%s"]' % value
    --> 976         return self.execute(Command.FIND_ELEMENT, {
        977             'using': by,
        978             'value': value})['value']
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
        319         response = self.command_executor.execute(driver_command, params)
        320         if response:
    --> 321             self.error_handler.check_response(response)
        322             response['value'] = self._unwrap_value(
        323                 response.get('value', None))
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
        240                 alert_text = value['alert'].get('text')
        241             raise exception_class(message, screen, stacktrace, alert_text)
    --> 242         raise exception_class(message, screen, stacktrace)
        243 
        244     def _value_or_default(self, obj, key, default):
    
    NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="rankbox_like"]/div/div[1 + i]/div[2]/div[1]/div[1]/a"}
      (Session info: chrome=92.0.4515.107)
    
[/code]

おそらくxpathをループで回そうとするところが間違っていると思うのですが、  
正しいやり方がわかりません。

もし解決策がわかる人は教えてください。

また、pythonは初心者でコードがあまり宜しく見えないかとも思われます。  
もしこうしたほうがいいというのがあったら教えてください。


CC BY-SA 4.0
2021-08-01T13:58:32.233
80520
2021-08-02T05:57:05.347
2021-08-02T05:57:05.347
47546
47546
question
python selenium xpath
seleniumでスクレイピングをする際、xpathのループの仕方がわかりません。