mpo*_*ora 8 .net c# html-agility-pack
我有一张这样的桌子
<table border="0" cellpadding="0" cellspacing="0" id="table2">
<tr>
<th>Name
</th>
<th>Age
</th>
</tr>
<tr>
<td>Mario
</td>
<th>Age: 78
</td>
</tr>
<tr>
<td>Jane
</td>
<td>Age: 67
</td>
</tr>
<tr>
<td>James
</td>
<th>Age: 92
</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
并希望使用HTML Agility Pack来解析它.我试过这段代码无济于事:
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
{
foreach (HtmlNode col in row.SelectNodes("//td"))
{
Response.Write(col.InnerText);
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
为什么不td直接选择s?
foreach (HtmlNode col in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td"))
Response.Write(col.InnerText);
Run Code Online (Sandbox Code Playgroud)
或者,如果您确实需要tr单独使用s 进行其他处理,请删除//并执行以下操作:
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("//table[@id='table2']//tr"))
foreach (HtmlNode col in row.SelectNodes("td"))
Response.Write(col.InnerText);
Run Code Online (Sandbox Code Playgroud)
当然,这只有在tds 是 s 的直接子级时才有效,tr但它们应该是,对吧?
编辑:
var cols = doc.DocumentNode.SelectNodes("//table[@id='table2']//tr//td");
for (int ii = 0; ii < cols.Count; ii=ii+2)
{
string name = cols[ii].InnerText.Trim();
int age = int.Parse(cols[ii+1].InnerText.Split(' ')[1]);
}
Run Code Online (Sandbox Code Playgroud)
使用 LINQ 可能有一种更令人印象深刻的方法来做到这一点。
我必须提供完整的 xpath。我根据 @Coda ( /sf/answers/217283391/ ) 的建议使用 Firebug 获得了完整的 xpath,最终得到了以下代码:
foreach (HtmlNode row in doc.DocumentNode.SelectNodes("/html/body/table/tbody/tr/td/table[@id='table2']/tbody/tr"))
{
HtmlNodeCollection cells = row.SelectNodes("td");
for (int i = 0; i < cells.Count; ++i)
{
if (i == 0)
{ Response.Write("Person Name : " + cells[i].InnerText + "<br>"); }
else {
Response.Write("Other attributes are: " + cells[i].InnerText + "<br>");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我确信它可以写得比这更好,但它现在对我有用。
| 归档时间: |
|
| 查看次数: |
29660 次 |
| 最近记录: |