2013-02-19 3 views
1

Я хочу использовать HAP для очистки данных из таблицы на веб-сайте, прокручивать строки, чтобы найти значение в столбце, которое соответствует предопределенной строке, а затем сохранить только ту строку, которая соответствует. Тогда у меня будет словарь с заголовком столбца в качестве ключа и текст столбца для выбранной строки в качестве значения.HTML Agility Pack и LINQ

Таблица ex.

<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]);     
    } 
} 

ответ

0

вы можете попробовать, чтобы выбрать весь тр, используя значение в тд Я думаю

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

посмотрите на эту

XPath to select a table row that has a cell containing specified text

+0

Спасибо. Это сделал трюк. Я все время искал HTML Agility Pack, LINQ и все остальное. Я не думал больше изучать XPath. – jrob42