我有一个方案来阅读表的内容并根据某些条件打印相同的内容。
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 :(得分: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']/..