我从表中获取数据但值显示不易操作。
我的HTML结构如:
<table>
<tbody>
<tr>
<td>
<span>1</span>
<span>0</span>
<br>
<span>
<span>Good Luck</span>
<img src="/App_Themes/Resources/img/icon_tick.gif" width="3" height="7">
</span>
</td>
</tr>
<tr>
<td>
<b>Nowaday<br></b>
<p>hook<br>zp</p>
</td>
</tr>
</tbody>
</table>
但是当我试图获取数据时会像:
10Good LuckNowadayhookzp
我正在使用此代码:
ReadOnlyCollection<IWebElement> lstTable = browser.FindElements(By.XPath("table/tbody/tr"));
foreach (IWebElement val in lstTable)
{
ReadOnlyCollection<IWebElement> lstTDElement = val.FindElements(By.XPath("td"));
ReadOnlyCollection<IWebElement> lstSpecialEle =
val.FindElements(By.XPath("//td/span | //td/b | //td/p"));
}
它会创建很多行(在<tr>
标签中找到大约6000个),我不知道如何安排正确的列。
因为每列,数据可以为null或在此具有多个值。
目前,我lstTDElement
包含两列(实际上:10列)。
lstSpecialEle
包含所有必要的数据。
我只过滤了[//td/span | //td/b | //td/p]
。
如何将lstSpecialEle
与lstTDElement
集成到权限列中。使用foreach
条件?
编辑:
典型的,我将从lstTDElement
收到:10Good LuckNowadayhookzp
。
lstSpecialEle
将创建包含我需要的所有值的多行。
问题是:我不知道如何将lstSpecialEle
中的所有行排列到表格中。
我的桌子有两个<tr>
标签;这意味着它有两列。如何将lstSpecialEle
中的所有值组织到此列中。
应该是这样的:
Num Time
1 0 Good Luck Nowaday hookzp
如上所述,数据是动态的,首先<tr>
或第二个<tr>
不能包含<span>
标记,或者没有标记<b>
等等(它只是没有出现,没有添加新的<tag>
答案 0 :(得分:1)
实际上,您在xpath中使用//
找到元素,这将在整个页面中搜索元素,而您只需在特定的行元素中搜索,因此您应该尝试使用.//
在你的xpath中,它将仅搜索元素特定的元素上下文。所以我认为你应该尝试如下,这将只给你想要的元素列表,而不是如下所示的大量元素列表:
ReadOnlyCollection<IWebElement> lstTable = browser.FindElements(By.XPath("//table/tbody/tr"));
foreach (IWebElement val in lstTable)
{
ReadOnlyCollection<IWebElement> lstSpecialEle = val.FindElements(By.XPath(".//td/span | .//td/b | .//td/p"));
}
Edited1 :如果获得带有空文本组合的元素列表,则可以使用null条件对其进行过滤,并获取包含以下精确文本的子列表: -
var FinalList = lstSpecialEle.Where(x=>x.Text != null).ToList();
Edited2 : - 如果要将所有列文本列表合并到单个字符串列表中,请尝试如下: -
List<string> FinalList = new List <string>();
foreach (IWebElement val in lstTable)
{
ReadOnlyCollection<IWebElement> lstSpecialEle = val.FindElements(By.XPath(".//td/span | .//td/b | .//td/p"));
var AllTextList = lstSpecialEle.Where(x=>x.Text != null).ToList().Select(El => El.Text).ToList();
string AllText = String.Join(" ", AllTextList);
FinalList.Add(AllText);
}
Console.WriteLine(FinalList);
现在FinalList
将包含按行分隔的所有值。
希望它有帮助...:)