2016-05-07 123 views
2

我有一个表格,当我单击“Inspect Element”并且通过View Source页面不可见时才会出现该表格。该表只包含两个每几个单元行和类似于此:通过Selenium中的表行进行迭代(Python)

<table class="datadisplaytable"> 
<tbody> 
<tr> 
<td class="dddefault">16759</td> 
<td class="dddefault">MATH</td> 
<td class="dddefault">123</td> 
<td class="dddefault">001</td> 
<td class="dddefault">Calculus</td> 
<td class="dddefault"></td> 
<td class="dddead"></td> 
<td class="dddead"></td> 
</tr> 
<tr> 
<td class="dddefault">16449</td> 
<td class="dddefault">PHY</td> 
<td class="dddefault">456</td> 
<td class="dddefault">002</td> 
<td class="dddefault">Physics</td> 
<td class="dddefault"></td> 
<td class="dddead"></td> 
<td class="dddead"></td> 
</tr> 
</tbody> 
</table> 

我试图做的是通过行迭代,并返回包含在每个单元格中的文本。我似乎无法用硒来做到这一点。元素不包含ID,我不知道如何获取它们。我不太熟悉使用xpaths等。

这里是一个调试的尝试,它返回一个TypeError

def check_grades(self): 
    table = [] 
    for i in self.driver.find_element_by_class_name("dddefault"): 
     table.append(i) 
    print(table) 

什么简便的方式来获得行中的文本?

+0

你能分享链接吗? –

回答

5

如果你想使用XPath通过排走行,你可以使用以下命令:

h = """<table class="datadisplaytable"> 
<tr> 
<td class="dddefault">16759</td> 
<td class="dddefault">MATH</td> 
<td class="dddefault">123</td> 
<td class="dddefault">001</td> 
<td class="dddefault">Calculus</td> 
<td class="dddefault"></td> 
<td class="dddead"></td> 
<td class="dddead"></td> 
</tr> 
<tr> 
<td class="dddefault">16449</td> 
<td class="dddefault">PHY</td> 
<td class="dddefault">456</td> 
<td class="dddefault">002</td> 
<td class="dddefault">Physics</td> 
<td class="dddefault"></td> 
<td class="dddead"></td> 
<td class="dddead"></td> 
</tr> 
</table>""" 

from lxml import html 
xml = html.fromstring(h) 
# gets the table 
table = xml.xpath("//table[@class='datadisplaytable']")[0] 


# iterate over all the rows 
for row in table.xpath(".//tr"): 
    # get the text from all the td's from each row 
    print([td.text for td in row.xpath(".//td[@class='dddefault'][text()]) 

,输出:

['16759', 'MATH', '123', '001', 'Calculus'] 
['16449', 'PHY', '456', '002', 'Physics'] 

使用td[text()]将避免让任何诺内斯返回为TD的没有文字。

所以,我们要做的使用硒同你会:

table = driver.find_element_by_xpath("//table[@class='datadisplaytable']") 

for row in table.find_elements_by_xpath(".//tr"): 
    print([td.text for td in row.find_elements_by_xpath(".//td[@class='dddefault'][text()]") 

多个表:

def get_row_data(table): 
    for row in table.find_elements_by_xpath(".//tr"): 
     yield [td.text for td in row.find_elements_by_xpath(".//td[@class='dddefault'][text()]") 


for table in driver.find_elements_by_xpath("//table[@class='datadisplaytable']"): 
    for data in get_row_data(table): 
     # use the data 
+0

谢谢。但是,如果有一个多于一个的表具有相同的类名,例如'datadisplaytable'?当我在寻找下一个(它是下面的那个)时,我的功能似乎总是与第一个表名一起使用。 –

+0

然后使用'tables = driver.find_elements_by_xpath(“// table [@ class ='datadisplaytable']”)'并应用每个表的逻辑,即'对于表格中的表格......如果数据使用ajax你可能会模仿帖子,你能分享链接吗? –

+0

不幸的是,该链接需要登录,并且不公开。但是,我正在测试此逻辑,并在更新时向我报告。再次感谢你。 –

0

另一个版本(修改,修正后的帕德里克·坎宁安): 测试与Python 3。 x

#!/usr/bin/python 

h = """<table class="datadisplaytable"> 
<tr> 
<td class="dddefault">16759</td> 
<td class="dddefault">MATH</td> 
<td class="dddefault">123</td> 
<td class="dddefault">001</td> 
<td class="dddefault">Calculus</td> 
<td class="dddefault"></td> 
<td class="dddead"></td> 
<td class="dddead"></td> 
</tr> 
<tr> 
<td class="dddefault">16449</td> 
<td class="dddefault">PHY</td> 
<td class="dddefault">456</td> 
<td class="dddefault">002</td> 
<td class="dddefault">Physics</td> 
<td class="dddefault"></td> 
<td class="dddead"></td> 
<td class="dddead"></td> 
</tr> 
</table>""" 

from lxml import html 
xml = html.fromstring(h) 
# gets the table 
table = xml.xpath("//table[@class='datadisplaytable']")[0] 


# iterate over all the rows 
for row in table.xpath(".//tr"): 
    # get the text from all the td's from each row 
    print([td.text for td in row.xpath(".//td[@class='dddefault']")])