如何在表中非常有效地提取行数据?
我有一个方案来读取表格的内容并根据特定的条件打印相同的内容。如何在表中非常有效地提取行数据?
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 ?
我不会给你写的代码,但我可以给你一个小费。
当您评估以下的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节点集,但它是有效的,因为空节点集被视为假。
谢谢,明白了。在上面的xpath中,而不是text()='',是否有任何内容需要检查。如果一个td元素包含一个句子,'马特是个好孩子'。在这种情况下,我想检查一下td是否包含Matt。 –
,你可以利用的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']/..
它返回什么?它是循环遍历整行吗?说如果有1000行,我的逻辑将循环1000次,即使只有5个匹配的条件。这个怎么用 ? –
它不循环所有行,它将简单地找到'第二列'将包含文本'亚特'和第三列'包含文本'dep1'的行,如果你将它用于findElements,它会发现所有与'findElement'匹配的行只是第一个匹配的行。循环快得多 –
我用'find_elements_by_xpath',它返回匹配对象的列表。如何进一步处理这些对象?你能用简单的例子来帮助我吗? –
页面是否有jQuery? –
一旦你提取了行,子XPath表达式应该是相对于每一行的,而不是再次从根中搜索......这没有意义 – Borna
@Borna:确切地说,循环遍历整个没有意义。我怎样才能使其效率和优化? –