我正在解析具有以下表格结构的网站
<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()]"
但它不起作用。
答案 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");