HTML 민첩성 팩 및 LINQ

c# html-agility-pack linq web-scraping

문제

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>

매치하고자하는 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')]]

이것 좀 봐

지정된 텍스트를 포함하는 셀이있는 테이블 행을 선택하는 XPath



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.