HtmlAgilityPack从html页面读取数据
本文关键字:读取 数据 html HtmlAgilityPack | 更新日期: 2023-09-27 18:04:03
我正在尝试使用html敏捷包从html表中获取数据,但只获取第一个表行的数据。
我正在读取的html代码如下:
<div id="mainDiv">
<table id="tbl">
<thead>
<tr>
<th class="tbl_col1">UserName</th>
<th class="tbl_col2">Points</th>
</tr>
</thead>
<tbody>
<tr data-source="provider1">
<td class="tbl_col1">
<a href="/Users/1090" id="UserLink" target="_blank">UserName1</a>
</td>
<td class="tbl_col2">
<a href="/UserPoints/1090" id="PointLink" target="_blank">1892 <span class="up_arrow"> </span></a>
</td>
</tr>
<tr data-source="provider2">
<td class="tbl_col1">
<a href="/Users/1090" id="UserLink" target="_blank">UserName2</a>
</td>
<td class="tbl_col2">
<a href="/UserPoints/1090" id="PointLink" target="_blank">3217 <span class="down_arrow"> </span></a>
</td>
</tr>
</tbody>
</table>
</div>
我正在使用这个代码
var UserTable = htmlDocument.DocumentNode.SelectSingleNode("//div[@id='mainDiv']").SelectSingleNode("//table[@id='tbl']").SelectSingleNode("//tbody").SelectNodes("//tr");
foreach (var row in UserTable)
{
if (row.Attributes["data-source"] != null)
{
string Source = row.Attributes["data-source"].Value;
string UserName = row.SelectSingleNode("td[@class='tbl_col1']").SelectSingleNode("//a[@id='UserLink']/text()").InnerText;
string Points = row.SelectSingleNode("td[@class='tbl_col2']").SelectSingleNode("//a[@id='PointLink']/text()").InnerText;
Console.WriteLine(Source + "'t" + UserName + "'t" + Points);
}
}
但是我一直得到这样的输出:
provider1 UserName1 1892
provider2 UserName1 1892
您做了错误的假设:在整个文档中搜索//a[@id='UserLink']/text()
和//a[@id='PointLink']/text()
。这就是为什么你得到第一个tr
节点。只使用:
string UserName = row.SelectSingleNode("td[@class='tbl_col1']/a[@id='UserLink']/text()").InnerText;
string Points = row.SelectSingleNode("td[@class='tbl_col2']/a[@id='PointLink']/text()").InnerText;
你也可以真正简化你的代码:
var UserTable = doc.DocumentNode.SelectNodes("//div[@id='mainDiv']/table[@id='tbl']/tbody/tr");
foreach (var row in UserTable)
{
if (row.Attributes["data-source"] != null)
{
string Source = row.Attributes["data-source"].Value;
string UserName = row.SelectSingleNode("td[@class='tbl_col1']/a[@id='UserLink']/text()").InnerText;
string Points = row.SelectSingleNode("td[@class='tbl_col2']/a[@id='PointLink']/text()").InnerText;
Console.WriteLine(Source + "'t" + UserName + "'t" + Points);
}
}