XPATH:解析表,下一行但同一列
本文关键字:一行 一列 XPATH | 更新日期: 2023-09-27 18:13:23
我正在解析一个具有以下表结构的网站
<tr>
<td>Description1</td>
<td>Description2</td>
<td>Description3</td>
<'tr>
<tr>
<td>Price1</td>
<td>Price2</td>
<td>Price3</td>
<'tr>
我需要的是匹配Description2和Price2等。,在不使用任何硬编码文本或类的情况下沿着列表进行。目前我有一个foreach循环通过所有的描述。我试着像这样使用position():
"../following-sibling::td[position()]"
,但它没有工作。
我不确定这是否符合您的要求,没有"硬编码文本或类",但这将分组列标题,与列值:
HtmlDocument doc = new HtmlDocument();
doc.Load("...");
var columns = doc.DocumentNode.SelectNodes("table/tr[position() = 1]/td")
.Select((n, i) => new {
Description = n.InnerText,
Values = n.ParentNode.SelectNodes(String.Format("following-sibling::tr/td[position() = {0}]", i + 1)).Select(v => v.InnerText)
});
你可以像这样遍历它:
foreach(var column in columns)
{
Console.WriteLine(column.Description);
foreach(var value in column.Values)
Console.WriteLine(" " + value);
}
这将产生:
Description1
Price1
Description2
Price2
Description3
Price3
如果只需要Description2列,可以添加Where子句,如下所示:
var columns = doc.DocumentNode.SelectNodes("table/tr[position() = 1]/td")
.Select((n, i) => new {
Description = n.InnerText,
Values = n.ParentNode.SelectNodes(String.Format("following-sibling::tr/td[position() = {0}]", i + 1)).Select(v => v.InnerText)
})
.Where(c => c.Description == "Description2");