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 </td>
<td> DUNN </td>
<td> JOE </td>
<td> 19931209 </font></td>
<td> Son </td>
</tr>
<tr>
<td>nbsp;02 </td>
<td> SMITH </td>
<td> MARY </td>
<td> 19950206 </font></td>
<td> Daughter </td>
</tr>
<tr>
<td>nbsp;03 </td>
<td> ROCKFORD </td>
<td> BILL </td>
<td> 20000320 </font></td>
<td> Son </td>
</tr>
</tbody></table>
매치하고자하는 DOB 날짜가 20000320이면 빌에 대한 모든 정보를 원합니다.
헤더 제목을 목록에 추가해도 아무런 문제가되지 않습니다. 나는 사용자 행을 올바르게 작성하지 않았다는 것을 안다. 내가 가지고있는 것은 여전히 하나의 행 대신 행 목록을 얻으려고하는 것입니다. 내가 사용자 행을 가지고 실행 한 또 다른 문제는 내부 텍스트가 "& nbsp"로 되돌아 올 것이고 나는 스페이스를 제거 할 방법이 필요하므로 .Replace를 할 수 없다는 것입니다. 나는 모든 제안에 열려 있습니다. 이 모든 일을하는 더 똑똑한 방법들.
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]);
}
}
당신은 내가 생각하는 값을 사용하여 전체 tr를 선택하려고 할 수 있습니다.
//*[@id=\"Table3\"]/tbody/tr[td//text()[contains(., 'targetString')]]
이것 좀 봐