【问题标题】:Error message when read multiple text elements using selenium使用 selenium 读取多个文本元素时出现错误消息
【发布时间】:2019-12-04 14:44:16
【问题描述】:

我正在单击某个链接,并希望读取给定类中的所有文本并将其作为 pandas 数据框中的一行返回

这是我的代码

page_link = 'http://beta.compuboxdata.com/fighter'
wait = WebDriverWait(cdriver,10)
wait.until(EC.visibility_of_element_located((By.ID,'s2id_autogen1'))).send_keys('Deontay Wilder')
wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'select2-result-label'))).click()
while True:
    wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more'))).click()
    try:
        element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more')))
        element.click()
    except TimeoutException:
        break
fights['fighters'] = wait.until(EC.find_element_by_class_name((By.CLASS_NAME,'col-xs-4 col-sm-4 col-md-4 col-lg-4'))).text

然而,这会返回错误消息:

TimeoutException: Message: 

我也尝试过使用 xpath,但仍然收到相同的错误消息:

fights['fighters'] = wait.until(EC.find_element_by_xpath((By.CLASS_NAME,'//div[@class="col-xs-4 col-sm-4 col-md-4 col-lg-4"]/div'))).text

我特别想得到这些数据:

根据要求,这是完整的回溯

<ipython-input-94-e2b36e136c00> in <module>
     14 wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'select2-result-label'))).click()
     15 while True:
---> 16     wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more'))).click()
     17     try:
     18         element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more')))

~\Anaconda3\lib\site-packages\selenium\webdriver\support\wait.py in until(self, method, message)
     78             if time.time() > end_time:
     79                 break
---> 80         raise TimeoutException(message, screen, stacktrace)
     81 
     82     def until_not(self, method, message=''):

TimeoutException: Message:

这是源 HTML

更新

我尝试添加一个 for 循环来读取多个文本元素,但仍然遇到相同的错误

elements = wait.until(EC.find_element_by_class_name((By.CLASS_NAME,'col-xs-4 col-sm-4 col-md-4 col-lg-4')))
for e in elements:
    print(e.text)

【问题讨论】:

  • 你能发布 html 页面源代码和完整的堆栈跟踪吗?如果你想在一个页面上收集多个元素,那么你必须使用 'find_elements' 方法而不是 'find_element'
  • @Sureshmani 我已经更新了我的问题

标签: python pandas selenium selenium-webdriver


【解决方案1】:

这里有一个解决方案。超时异常会在这里处理。

    age_link = 'http://beta.compuboxdata.com/fighter'
driver.get(age_link)
wait = WebDriverWait(driver,10)
wait.until(EC.visibility_of_element_located((By.ID,'s2id_autogen1'))).send_keys('Deontay Wilder')
wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'select2-result-label'))).click()
#Click on View More until it exists
while True:
    try:
        element = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'view_more')))
        print("Clicking on View More")
        element.click()
    except TimeoutException:
        break
fighters = driver.find_elements_by_xpath("//div[@class='row row-bottom-margin-5']/div[2]")
#fighters = driver.find_elements_by_class_name("col-xs-4 col-sm-4 col-md-4 col-lg-4")
print(len(fighters))
# Print all the fighter names
for fighter in fighters:
    print(fighter.text)    

【讨论】:

  • 谢谢,不过似乎没有打印出任何东西
  • @Emm 查看更新的答案。现在正在打印战斗机详细信息。
  • 谢谢,为什么它适用于 'xpath' 而不是 'by_class_name' ?
  • 它抛出错误消息:无效选择器:不允许复合类名。所以我尝试过使用 xpath。
猜你喜欢
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 1970-01-01
  • 2022-06-10
相关资源
最近更新 更多