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

时间:2014-07-16 17:10:45

标签: c# html xpath html-agility-pack

我正在解析具有以下表格结构的网站

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

但它不起作用。

1 个答案:

答案 0 :(得分:0)

我不确定这是否符合您对&#34;硬编码文本或类&#34; 的要求,但这会将列标题与列值进行分组:

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