首页 > 解决方案 > Selenium 试图遍历一个表,但现在卡在第一个表上

问题描述

我在这里有点头疼,我正在使用 Python 3 和 selenium 处理一张桌子。我正在尝试从表 ( tblGuid) 中提取一些数据,并从几列中获取一些信息。

虽然数据可能被正确检索(len(rows)打印预期的行数),但迭代器似乎卡在第一个元素上,只socket重复打印相同的内容,打印数量匹配len(rows)

vlan = "vlan14"

time.sleep(3)
# Enter filter for vlan
print("Filtered by vlan: " + vlan)
browser.find_element_by_xpath("/html/body/div[1]/div[4]/div[3]/div[4]/div/div[2]/div/div[1]/div[3]/div/table/tfoot/tr/th[13]/input").send_keys(vlan)

# Sort by socket
browser.find_element_by_xpath("/html/body/div[1]/div[4]/div[3]/div[4]/div/div[2]/div/div[1]/div[1]/div/table/thead/tr/th[14]").click()

time.sleep(2)
table = browser.find_element_by_id('tblGuid')
rows = table.find_elements_by_xpath(".//tr")

time.sleep(2)

print("Len: ", len(rows))

for row in rows:
    socket = row.find_element_by_xpath('//td[10]').text
    print("Socket: ", socket)
    # Other stuff of the same natures as the above two lines go here. Get a different column and assign it to a variable.

browser.quit()

我正在使用 Firefox 运行此代码,而不是打开无头模式,以确认所有点击、排序和过滤器都按预期应用。浏览器输出看起来和预期的一样,数据都在那里,socket 是一个在 1 到 52 之间变化的数字,大约 50 行。在我看来,for循环卡在rows.

我添加了很多(可能是多余time.sleep()的,以确保页面正确加载,以便我可以看到页面随着脚本的进行而更新。

值得一提的是,我正在抓取的页面不包含 HTML 中的表格数据,因为它是由在数据库上运行的 javascript 填充的。起初我认为这是问题所在,但作为套接字打印的数据与表的第一行匹配(与任何其他列一样)这一事实告诉我正在正确检索数据,但我无法对其进行迭代.

编辑 - HTML 的清理版本

<table id="tblGuid" class="table table-striped table-hover table-condensed detailedTable table-bordered dataTable" style="width: 99.9%;" role="grid" aria-describedby="tblGuid_info">                    
    <tbody>
        <tr role="row" class="odd">
            <td><button class="tableButton regguid" data-guid="0046ca">Reg.</button></td>
            <td>0046ca</td>
            <td>0110F17754</td>
            <td>A18122</td>
            <td><a href="detail?serial=37530" target="_blank">37530</a></td>
            <td>05929a</td>
            <td>3.0.0</td>
            <td>19-12-21 19:56</td>
            <td>20-01-19 19:53</td>
            <td>20-01-19 19:53</td>
            <td>20526661632</td>
            <td>1</td>
            <td>vlan14</td>
            <td class="sorting_1">1</td>
            <td>0</td>
            <td><a data-node-error="0" data-node-guid="0046ca" href="#">            0</a></td>
            <td><a href="qc?rclId=1279" target="_blank">145811</a></td>
            <td>5554</td>
            <td>152263</td>
            <td>Done</td>
        </tr>
        <tr role="row" class="even">
            <td><button class="tableButton regguid" data-guid="004aa4">Reg.</button></td>
            <td>004aa4</td>
            <td>0110F17D8D</td>
            <td>A19108</td>
            <td><a href="detail?serial=37740" target="_blank">37740</a></td>
            <td>05936c</td>
            <td>3.0.0</td>
            <td>19-12-21 20:15</td>
            <td>20-01-19 19:54</td>
            <td>20-01-19 19:54</td>
            <td>20517699584</td>
            <td>1</td>
            <td>vlan14</td>
            <td class="sorting_1">2</td>
            <td>0</td>
            <td><a data-node-error="0" data-node-guid="004aa4" href="#">            0</a></td>
            <td><a href="qc?rclId=1277" target="_blank">147011</a></td>
            <td>5548</td>
            <td>152311</td>
            <td>Done</td>
        </tr>
    </tbody>
</table>

对上述 HTML 的注释:

标签: python-3.xseleniumhtml-table

解决方案


如果没有表格 html,这是我最好的猜测。看起来 xpath 并没有达到预期的效果。尝试使用:find_element_by_xpath('.//td[10]').text

for row in rows:
    columns = row.find_elements_by_xpath('.//td')
    for column in range(len(columns)):
        print("column::{}:".format(column), columns[column].text)
    #testsocket = columns[9].text
    socket = row.find_element_by_xpath('.//td[10]').text
    print("Socket: ", socket)
    #print("TestSocket: ", testsocket)

推荐阅读