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()]"

,但它没有工作。

XPATH:解析表,下一行但同一列

我不确定这是否符合您的要求,没有"硬编码文本或类",但这将分组列标题,与列值:

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");