如何在表中非常有效地获取行数据?

时间:2017-09-14 12:32:24

标签: python-2.7 selenium xpath selenium-webdriver

我有一个方案来阅读表的内容并根据某些条件打印相同的内容。

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 ?

2 个答案:

答案 0 :(得分: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]/text()= 'DEP1'] / TD

注意附加的/td,这意味着我们将获取所有td元素,这将为我们提供matched_rows_count*columns_count个元素的列表。 只有每行具有固定数量的列(相同数量的td元素)时,此方法才有效。

那么,如何提取值并将其保存为其他地方的行? 由于您知道列数,因此您还知道列表中每行的起始位置和结束位置。以您的表为例,第一行(其td元素)位于返回列表中位置0,1,2,3,4,第二行位于5,6,7,8,9,依此类推......

<强>更新

以下是一个更新,其中显示了contains与给定示例的用法。

  

// table / tbody / tr [./ td [position()= 2并包含(。,'Matt')]和   ./td[position()=3并包含(。,'Dep1')]] / td

使用.可以搜索text node内的每个td

检查一下:

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

它将返回一个节点集,但它是有效的,因为空节点集被视为 false

答案 1 :(得分:0)

你可以使用xpath。

  

假设你想找到ColB包含Matt和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']/..