在selenium(python)中单击链接时循环遍历表的行

时间:2018-01-27 08:43:27

标签: python selenium web-scraping

示例页面源代码如下

<div class='div1'>
  <table class="foot-market">
    <tbody data-live="false">
      <td class='today-name'/>
    </tbody>
    <tbody data-live="false">
      <td class='today-name'/>
    </tbody>
    <tbody data-live="false">
      <td class='today-name'/>
    </tbody>
  </table

  <table class="foot-market">
    <tbody data-live="false">
      <td class='today-name'/>
    </tbody>
    <tbody data-live="false">
      <td class='today-name'/>
    </tbody>
    <tbody data-live="false">
      <td class='today-name'/>
    </tbody>
  </table
</div>

解释 嗨, 所以,让我们来做吧。 如上所示,我与之交互的代码段位于<div class='div1'>中。 <td class='today-name'>是可点击的,点击后会显示一个页面(感兴趣的页面

所以我想循环获取每个<tbody data-live="false">并点击它。

从我的研究中我发现没有类似的东西,但我找到了有趣的东西,但没有任何帮助。我感谢所有给予的帮助。

感谢。

我的代码

import time
import selenium
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.firefox.options import Options
from BeautifulSoup import BeautifulSoup

#some of the imports are for headless firefox so don't mind them
#for.testing.purposes.only
driver = webdriver.Firefox()

url = 'here://code.above.com/'
driver.get(url)

#looping rows in selenium
table = driver.find_elements_by_xpath("//table[@class='foot-market']")

for row in table.find_element_by_xpath("//tbody[@data-live='false']"):
    row.find_element_by_xpath("//td[@class='today-name']").click()

    #try for one row first
    # driver.back()
    break

错误

返回的错误符合:

for row in table.find_element_by_xpath("//td[@data-live='false']"):

异常

  

AttributeError:&#39; list&#39;对象没有属性&#39; find_element_by_xpath&#39;

这是有道理的,但我怎么做到这一点......

1 个答案:

答案 0 :(得分:1)

您看到的错误说明了一切:

for row in table.find_element_by_xpath("//td[@data-live='false']"): AttributeError: 'list' object has no attribute 'find_element_by_xpath'

以下行容易出错:

for row in table.find_element_by_xpath("//td[@data-live='false']"):

根据您之前的行:

table = driver.find_elements_by_xpath("//table[@class='foot-market']")

列表,您无法在列表上调用find_element_by_xpath()。可以在 webdriver 实例或 webelement 上调用find_element_by_xpath()

您的工作代码如下:

all_tds = driver.find_elements_by_xpath("//table[@class='foot-market']//td[@class='today-name']")
for tds in all_tds :
    tds.click()
    #try for one row first and break out
    break
  

注意:这是克服错误AttributeError: 'list' object has no attribute 'find_element_by_xpath'try for one row first

的基本解决方案

更新

如果您打算遍历表格中的所有td元素,那么您必须捕获基本网址,以便我们可以恢复到主页面以查找点击后续元素,如下所示:

base_url = driver.current_url
count_all_tds = len(driver.find_elements_by_xpath("//table[@class='foot-market']//td[@class='today-name']"))
for td in range(count_all_tds):
    driver.find_elements_by_xpath("//table[@class='foot-market']//td[@class='today-name']")[td].click()
    # code block for other required actions and finally redirect to base_url
    driver.get(base_url)