80769


seleniumを使用してスクレイピングをしようと考えています。  
xpathの一部を変数にしてループさせてテキストを表示しようと考えています。

**わからないこと**  
ループで回して取得しようとするのですが、取得する値の数がその時々で変わるので  
何回ループを回せばよいのかわかりません。  
ですので、該当するxpathが存在しなかった場合、ループを終わりにしたいのですが、うまくいかずエラーが起きてしまいます。  
どのようにすればエラー無く終わりにできるか教えていただけるとありがたいです。

**自分のコード**

[code]

    for i in range(1, 100):
        elem_username = browser.find_element_by_xpath(f'//*[@id="__next"]/div/div[4]/div/ul/div[{i}]/a/div/div[2]/div/ul[1]/li')
        if elem_username is None:
            break
        else:
            username = elem_username.text
            print(username)
    
[/code]

**エラー内容**

[code]

    ---------------------------------------------------------------------------
    NoSuchElementException                    Traceback (most recent call last)
    <ipython-input-199-f0a1904f1817> in <module>
          1 #//*[@id="__next"]/div/div[4]/div/ul/div[2]/a/div/div[2]/div/ul[1]/li
          2 for i in range(1, 100):
    ----> 3     elem_username = browser.find_element_by_xpath(f'//*[@id="__next"]/div/div[4]/div/ul/div[{i}]/a/div/div[2]/div/ul[1]/li')
          4     if elem_username is False:
          5         break
    
    ~\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="__next"]/div/div[4]/div/ul/div[20]/a/div/div[2]/div/ul[1]/li"}
      (Session info: chrome=92.0.4515.131)
    
[/code]

**追加**  
アドバイスを参考に自身でやってみました。

[code]

    def main():
        try:
            for i in range(1,100):
                elem_username = browser.find_element_by_xpath(f'//*[@id="__next"]/div/div[4]/div/ul/div[{i}]/a/div/div[2]/div/ul[1]/li')
                username = elem_username.text
                print(username)
        except NoSuchElementException:
            pass
                
    main()    
    
[/code]

発生したエラー内容をpassでスルーしようと考え上記のコード書いてみたのですが、  
エラーが発生しました。

[code]

    ---------------------------------------------------------------------------
    NoSuchElementException                    Traceback (most recent call last)
    <ipython-input-210-d3324d9fddd1> in main()
          3         for i in range(1,100):
    ----> 4             elem_username = browser.find_element_by_xpath(f'//*[@id="__next"]/div/div[4]/div/ul/div[{i}]/a/div/div[2]/div/ul[1]/li')
          5             username = elem_username.text
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element_by_xpath(self, xpath)
        393         """
    --> 394         return self.find_element(by=By.XPATH, value=xpath)
        395 
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value)
        975                 value = '[name="%s"]' % value
    --> 976         return self.execute(Command.FIND_ELEMENT, {
        977             'using': by,
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params)
        320         if response:
    --> 321             self.error_handler.check_response(response)
        322             response['value'] = self._unwrap_value(
    
    ~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response)
        241             raise exception_class(message, screen, stacktrace, alert_text)
    --> 242         raise exception_class(message, screen, stacktrace)
        243 
    
    NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="__next"]/div/div[4]/div/ul/div[47]/a/div/div[2]/div/ul[1]/li"}
      (Session info: chrome=92.0.4515.131)
    
    
    During handling of the above exception, another exception occurred:
    
    NameError                                 Traceback (most recent call last)
    <ipython-input-210-d3324d9fddd1> in <module>
          8         pass
          9 
    ---> 10 main()
    
    <ipython-input-210-d3324d9fddd1> in main()
          5             username = elem_username.text
          6             print(username)
    ----> 7     except NoSuchElementException:
          8         pass
          9 
    
    NameError: name 'NoSuchElementException' is not defined
    
[/code]

行き詰ってしまいました。  
アドバイスを頂けると幸いです。


CC BY-SA 4.0
2021-08-13T04:40:45.250
80768
2021-08-13T16:41:09.987
2021-08-13T13:34:04.257
3060
47546
question
python selenium
selenium でのループ処理中にエラー発生時も終了しないようにしたい


「NoSuchElementException（そのような要素が存在しません）」というエラーが出ていますので、例外処理でこのエラーをキャッチしてループから抜け出す処理を書くといいと思います。  
参考までにPythonでの例外処理の方法を載せておきます。  
<https://note.nkmk.me/python-try-except-else-finally/>

<補足>

[code]

    elem_username = browser.find_element_by_xpath(f'//*[@id="__next"]/div/div[4]/div/ul/div[{i}]/a/div/div[2]/div/ul[1]/li')
    
[/code]

ifに到達する前のこの行でエラーが発生してしまっているので、ifブロック内のbreakの処理をする前にプログラムが止まってしまっています。例外処理をすることで、エラーが発生しても処理を続行させることができます。


CC BY-SA 4.0
2021-08-13T05:19:48.973
80769
2021-08-13T06:26:36.017
2021-08-13T06:26:36.017
47701
47701
80768
answer


[`WebDriver.find_elements_by_xpath()`](https://selenium-
python.readthedocs.io/api.html?highlight=find_elements_by_xpath#selenium.webdriver.remote.webdriver.WebDriver.find_elements_by_xpath)
を使う方法もあります。この場合は `NoSuchElementException`
が発生せず、セレクタにマッチする要素がない場合は空リスト(`[]`)が返ります。

[code]

    def main():
        elem_username = browser.find_elements_by_xpath(
          '//*[@id="__next"]/div[1]/div[4]/div[1]/ul[1]/div/a[1]/div[1]/div[2]/div[1]/ul[1]/li[1]')
        for e in elem_username:
            username = e.text
            print(username)
    
    main()
    
[/code]


CC BY-SA 4.0
2021-08-13T16:41:09.987
80780
2021-08-13T16:41:09.987
47127
80768
answer