我试图在python中使用selenium捕获一些网站元素,我正在使用try / except,以防在该特定页面中找不到特定元素。这一切都很好,但是脚本仍会抛出NoSuchElementException,即使我期待它并告诉脚本以某种方式处理它或通过它。
我能想到的唯一可能是问题的是这个try / except嵌套在另一个try / except中,所以我就这样了
for month in (month_start, month_end):
for date in (date_start, date_end):
try: #this is just a general try in case there is a breakdown in finding one of the elements
driver.get(url)
results = driver.find_elements_by_xpath("""//*[@class="results"]/div""")
for result in results:
sample_element = result.find_element_by_xpath("blah").text
#seems to be where the problem starts
specific_element = ""
try:
#this is a specific element that I know may not exist
specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
except NoSuchElementException:
specific_element = ""
#I have tried pass instead as well with no luck
#throws an error here and won't continue if the specific element is not found
except:
#pretty much a copy of the above try with some changes
所以我一般认为我对python中的try / except函数有一个很好的理解,但这是我的头脑。“结果结果”循环将很乐意继续,直到它找不到specific_element并抛出一个“selenium.common.exceptions.NoSuchElementException:消息:没有这样的元素:无法找到元素:”
如果嵌入try / except内部是整个问题的原因,请你解释为什么会这样,并推荐一个可以研究或实施的可能解决方案?或许我错过了一些基本的东西。
答案 0 :(得分:1)
我不做python但如果是我,我会删除所有的try / catches并用find_elements_*
替换它们并检查空列表。例如
替换
specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
与
elements = result.find_elements_by_xpath(".//*[@class='specific']/div")
if elements
specific_element = elements[0]
这基本上只是确保在访问它之前找到任何元素,并且可以避免所有的try / catches。我认为异常应该是特殊的......很少见。它们不应被期望或用作流量控制等。
答案 1 :(得分:0)
你必须在这里处理几点:
try
driver.get(url)
问题出在以下块中:
try:
specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
在try()
实际发挥作用之前,您已尝试过一系列事件:
评估
result.find_element_by_xpath(""".//*[@class="specific"]/div""")
下一步
result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
下一步
specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""").text
所以,
result.find_element_by_xpath(""".//*[@class="specific"]/div""")
失败,但 NoSuchElementException
被提出,try
仍然保持沉默。一个简单的解决方案是:
try:
specific_element = result.find_element_by_xpath(""".//*[@class="specific"]/div""")
specific_element_text = specific_element.text
# other works
except NoSuchElementException:
specific_element = ""
# other works