2017-09-14 76 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',它返回匹配对象的列表。如何进一步处理这些对象?你能用简单的例子来帮助我吗? –

相关问题