HTML敏捷包和LINQ

本文关键字:LINQ HTML | 更新日期: 2023-09-27 18:00:20

我想使用HAP从网站上的表中抓取数据,在行中循环查找与预定义字符串匹配的列中的值,然后只存储匹配的行。然后,我将有一个以列标题为键,以所选行的列文本为值的字典。

表,不包括

<table id="Table3">
<tbody><tr><td></td></tr>
<tr>
<td>ID</td>
<td>Last Name</td>
<td>First Name</td>
<td>Birth Date</td>
<td>Relation</td>
</tr>
<tr>
<td>nbsp;01&nbsp;</td>
<td>&nbsp;DUNN          &nbsp;</td>
<td>&nbsp;JOE          &nbsp;</td>
<td>&nbsp;19931209&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>
<tr>
<td>nbsp;02&nbsp;</td>
<td>&nbsp;SMITH          &nbsp;</td>
<td>&nbsp;MARY          &nbsp;</td>
<td>&nbsp;19950206&nbsp;</font></td>
<td>&nbsp;Daughter&nbsp;</td>
</tr>
<tr>
<td>nbsp;03&nbsp;</td>
<td>&nbsp;ROCKFORD          &nbsp;</td>
<td>&nbsp;BILL          &nbsp;</td>
<td>&nbsp;20000320&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>
</tbody></table>

如果我想匹配的出生日期是20000320,那么我想要比尔的所有信息。

将标题添加到列表中是没有问题的。我知道我没有把用户行写对。我仍然在尝试获取行列表,而不是一行。我在用户行遇到的另一个问题是,内部文本中会返回"&nbsp",我不能只做一个替换,所以我需要一种删除空格的方法。我对所有的建议都持开放态度。做这一切的更聪明的方法等等。

List<string> headerList = new List<string>();
List<string> userList = new List<string>();
var htmlRows = htmlDoc.DocumentNode.SelectNodes("//*[@id='"Table3'"]/tbody/tr");
if(htmlRows != null)
{
     // Add first row which contains column headings
     htmlRows[2]
         .Elements("td")
         .Select(td => td.InnerText.Trim())
         .ToList()
         .ForEach(header => headerList.Add(header));
     // Add user rows
     htmlRows
         .Skip(3)
         .Select(tr => tr.Elements("td")
             .Where(td => td.InnerText.Trim() == dteDOB))
             .ToList()
         .ForEach(row => userList.Add(row));
    for(int i = 0; i < headerList.Count; i++)
    {
        if(headerList.Count == userList.Count && userList[i] != null)
            dictValues.Add(headerList[i], userList[i]);                 
    }
}

HTML敏捷包和LINQ

您可以尝试使用td中的值来选择整个tr,我认为

//*[@id='"Table3'"]/tbody/tr[td//text()[contains(., 'targetString')]]

看看这个

XPath来选择具有包含指定文本的单元格的表行