2016-05-07 50 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']")])