如何使用Selenium Python迭代HTML表格并打印第三列的值?

3

我有一个包含多行和多列的HTML表格。我可以迭代每一行并打印出所有列的值。 我想要打印第三列的值。我该怎么做?

HTML代码片段如下:

    <table id="search_data_browser_ct_data_browser" class="GFNQNVHJE" cellspacing="0" __gwtcellbasedwidgetimpldispatchingfocus="true" __gwtcellbasedwidgetimpldispatchingblur="true">
<thead aria-hidden="false">
<colgroup>
<tbody>
<tr class="GFNQNVHCD GFNQNVHJD" __gwt_subrow="0" __gwt_row="0">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHED GFNQNVHKD">
<div __gwt_cell="cell-gwt-uid-193" style="outline-style:none;">
<span class="linkhover" title="31" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;empty-cells:show;display:block;color:#00A;cursor:pointer;">31</span>
</div>
</td>
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHKD">
<div __gwt_cell="cell-gwt-uid-194" style="outline-style:none;">1</div>
</td>
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHKD">
<div __gwt_cell="cell-gwt-uid-195" style="outline-style:none;">
<span class="linkhover" title="Mr|Batman|Bane|Male" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;empty-cells:show;display:block;color:#00A;cursor:pointer;">Mr|Batman|Bane|Male</span>
</div>
</td>
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHKD">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHKD">
<td class="GFNQNVHBD GFNQNVHDD GFNQNVHOD GFNQNVHKD">
</tr>
<tr class="GFNQNVHCE" __gwt_subrow="0" __gwt_row="1">
<tr class="GFNQNVHCD" __gwt_subrow="0" __gwt_row="2">
<tr class="GFNQNVHCE" __gwt_subrow="0" __gwt_row="3">
<tr class="GFNQNVHCD" __gwt_subrow="0" __gwt_row="4">
<tr class="GFNQNVHCE" __gwt_subrow="0" __gwt_row="5">
<tr class="GFNQNVHCD" __gwt_subrow="0" __gwt_row="6">
<tr class="GFNQNVHCE" __gwt_subrow="0" __gwt_row="7">
<tr class="GFNQNVHCD" __gwt_subrow="0" __gwt_row="8">
<tr class="GFNQNVHCE" __gwt_subrow="0" __gwt_row="9">
</tbody>
<tbody style="display: none;">
<tfoot style="display: none;" aria-hidden="true"/>
</table>

我的方法实现如下:

def is_results_displayed_in_data_browser(self):
try:
    table_id = self.driver.find_element(By.ID, 'search_data_browser_ct_data_browser')
    rows = table_id.find_elements(By.TAG_NAME, "tr")  # get all of the rows in the table
    for row in rows:
        # Get the columns (all the column 2)
        cols = row.find_elements(By.TAG_NAME, "td")  # note: index start from 0, 1 is col 2
        for col in cols:
            print col.text
except NoSuchElementException, e:
    print "Element not found "
    print e
    self.save_screenshot("is_results_displayed_in_data_browser")

我已经尝试过:

print col[2].text

The error I get is:

    Traceback (most recent call last):
  File "E:\test_runners 2 edit project\selenium_regression_test_5_1_1\LADEMO_Matching_and_Reporting_TestCase\Lademo_Matching_and_Reporting_TestCase.py", line 496, in test_000008_simple_text_search
    data_browser_page.is_results_displayed_in_data_browser()
  File "E:\test_runners 2 edit project\selenium_regression_test_5_1_1\Pages\Reports\reports_data_browser.py", line 104, in is_results_displayed_in_data_browser
    print col[2].text
TypeError: 'WebElement' object does not support indexing

我也尝试了以下方法:

for col in cols:
print cols[2].text

我遇到了以下错误:

    Traceback (most recent call last):
  File "E:\test_runners 2 edit project\selenium_regression_test_5_1_1\Base\BaseTestCase.py", line 174, in tearDownClass
    cls.login_page.click_logout()
  File "E:\test_runners 2 edit project\selenium_regression_test_5_1_1\Pages\login.py", line 129, in click_logout
    self.click_yes_from_confirm_dialog_to_confirm()
  File "E:\test_runners 2 edit project\selenium_regression_test_5_1_1\Pages\base.py", line 106, in click_yes_from_confirm_dialog_to_confirm
    yes_button_element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.ID, 'message_dialog_b_yes')))
  File "E:\Python27\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
TimeoutException: Message: 

感谢,Riaz。

是否发生了任何错误? - Piyush
你的错误在这个代码块中,而不是你上面提到的那段代码中。 yes_button_element = WebDriverWait(self.driver, 20).until(EC.element_to_be_clickable((By.ID, 'message_dialog_b_yes'))). - saurabh baid
我认为你应该执行 "print cols[2].text"。 - saurabh baid
如果我执行 print cols[2].text,会出现 IndexError: list index out of range。 - Riaz Ladhani
如果我执行print cols [0] .text,它会打印出第一列中的所有ID值。奇怪的是cols [2]不起作用。 - Riaz Ladhani
啊,现在它正在打印cols [2]中的值。但在迭代结束时,它会显示IndexError:列表索引超出范围。 - Riaz Ladhani
4个回答

2

'WebElement'对象不支持索引

实际上col是单个WebElement,而您假定它是一个列表,因此应该是

print cols[2].text

如果我执行print cols[2].text,会出现IndexError:列表索引超出范围

在传递索引之前,您需要检查cols列表的长度以克服此错误,如下所示:

if len(cols)  >= 3 :
  print cols[2].text

1
这对我有效。不再有索引超出范围的问题了。现在所有名称值都已打印出来。感谢您的帮助。 - Riaz Ladhani

2

我将为您提供一份代码,其中可以提取所有td标签的值。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome('./chromedriver')

#Open the page
driver.get('file:///.../a.html')

ele = driver.find_elements_by_xpath("//table[@id='search_data_browser_ct_data_browser']/tbody/tr")
for e in ele:
    for td in e.find_elements_by_xpath(".//td"):
        print td.text

谢谢,我有一个可以打印出所有列值的工作代码。我想打印出第二列的所有值。如何仅使用索引打印出第二列的值? - Riaz Ladhani

0

你可以使用CSS选择器来查找td下的节点。使用td:nth-child()语法。

 table_id = self.driver.find_element(By.ID,'tableid')

 rows = table_id.find_elements(By.TAG_NAME, "tr")

 for row in rows:
 cols = row.find_elements_by_css_selector('td:nth-child(2)')
 for col in cols:
     print('this is {}'.format(col.text))

0

I have tried:

print col[2].text

试一下

if len(cols)>2:
    cols[2].text

打印 cols[2].text 给我返回了 IndexError: list index out of range 错误。 - Riaz Ladhani
如果我执行print cols[0].text,它会打印出第一列中所有ID值。奇怪的是,cols[2]不起作用。 - Riaz Ladhani
啊,现在它正在打印cols [2]中的值。但在迭代结束时,它会显示IndexError:列表索引超出范围。 - Riaz Ladhani
这是因为您的某些行没有这些列。您只在第一行中有多个列。 我认为您可以轻松地编写逻辑来处理它。 - saurabh baid
我可能能够为您提供一个特定于此场景的解决方案,但长期的解决方案将基于您的实际数据而不仅仅是测试数据。 - saurabh baid
我已更新我的解决方案以处理索引错误。 - saurabh baid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接