2017-09-14 81 views
-1

我有一個方案來讀取表格的內容並根據特定的條件打印相同的內容。如何在表中非常有效地提取行數據?

ColA  ColB  ColC ColD  ColE 
1  Matt  Dep1 NY   1234 
2  Joy  Dep2 Sydeny  1234 
3  Matt  Dep1 Canada  1234 
4  Stewart Dep3 Sydney  1234 

這就是表的樣子。我正在獲取表格內容並進行打印。 即使我能夠得到我想要的。比方說,我想將行存儲在一個數組中,其中ColB包含Matt,ColC包含Dep1。它通過獲取行數,然後繼續迭代整行,將tr [row_index]更改爲多達第一個循環。儘管預期數據不在後面的行中。如果我們有1000行,這很耗時。

有沒有什麼辦法可以優化它?我們可以通過tr[row_index]所做的包含多個列值,像這樣?

tdata = driver.get_text("xpath=//table[@id='table1234']/tbody" #tdata will have the entire table content 
rows = driver.get_matching_xpath_count("//table[@id='table1234']/tbody//tr") 
    for i in range(1, int(rows)+1): 
     if "matt" = driver.get_text("xpath=//table[@id='table1234']/tbody/tr["+str(i)+"]/td[2]") and "Dep1" == driver.get_text("xpath=//table[@id='table1234']/tbody/tr["+str(i)+"]/td[3]"): 
        row_rext = row_text=driver.get_text("xpath=//table[@id='table1234']/tbody/tr["+str(i)+"]") 
#print or store in a list, should not be a problem 

reg-ex的任何可能性?或者其他有效的方式?

[更新]

I could able to achieve it with reg-ex in a faster way. Any selenium way to achieve the same ? 
+0

頁面是否有jQuery? –

+0

一旦你提取了行,子XPath表達式應該是相對於每一行的,而不是再次從根中搜索......這沒有意義 – Borna

+0

@Borna:確切地說,循環遍歷整個沒有意義。我怎樣才能使其效率和優化? –

回答

1

我不會給你寫的代碼,但我可以給你一個小費。

當您評估以下的XPath,

的XPath:

//table[@id='table1234']/tbody/tr[./td[2]/text()= 'Matt'和 ./td[3]/text()='Dep1']

您將擁有一個tr元素列表。 因此,你所要做的就是遍歷返回的tr元素列表,併爲每個元素提取它的子節點(td)

-

也有另一種方法,如果欄數是固定的(這是你的情況下)。

看看這個XPath:

//table[@id='table1234']/tbody/tr[./td[2]/text()='Matt」和 ./td [3] /文本()= 'DEP1']/TD

通知所附/td,這意味着我們要去獲取所有td元素,這會給我們帶來matched_rows_count*columns_count數量的元素的列表。 只有每行有固定數量的列(相同數量的td元素),這種方法纔有效。

那麼,如何提取值並將它們保存爲其他位置的行呢? 既然你知道列數,你也知道列表中每一行的起始和結束位置。以你的表格爲例,第一行(它的td元素)在位置0,1,2,3,4的返回列表中,第二行位於5,6,7,8,9等等...

UPDATE

這裏是顯示contains與給定的例子中,使用的更新。

//table/tbody/tr[./td[position()=2和含有(。, '馬特')]和 ./td[position()=3和含有(。,」 DEP1' )]/TD

使用.將使其每text node這是內部td

檢查這裏面搜索:

./td[position()=2 and contains(.,'Matt')] 

它將[R eturn節點集,但它是有效的,因爲空節點集被視爲

+0

謝謝,明白了。在上面的xpath中,而不是text()='',是否有任何內容需要檢查。如果一個td元素包含一個句子,'馬特是個好孩子'。在這種情況下,我想檢查一下td是否包含Matt。 –

0

,你可以利用的XPath。

比方說,你想找到排在那裏COLB包含馬特和COLC 包含DEP1

中的XPath將

row_elm = driver.find_element_by_xpath("//table[@id='table1234']/tbody/tr/td[position()=2 and text()='matt']/../td[position()=3 and text()='Dep1']/.. 
+0

它返回什麼?它是循環遍歷整行嗎?說如果有1000行,我的邏輯將循環1000次,即使只有5個匹配的條件。這個怎麼用 ? –

+0

它不循環所有行,它將簡單地找到'第二列'將包含文本'亞特'和第三列'包含文本'dep1'的行,如果你將它用於findElements,它會發現所有與'findElement'匹配的行只是第一個匹配的行。循環快得多 –

+0

我用'find_elements_by_xpath',它返回匹配對象的列表。如何進一步處理這些對象?你能用簡單的例子來幫助我嗎? –

相關問題