2015-09-19 2 views
0

Я использую HtmlAgilityPack для извлечения данных из источника HTML-кода. Это пример HTML:Как избежать повторения данных, извлеченных из источника HTML, используя HtmlAgilityPack

<div class="enum-container"> 
    <div class="enum"> 
     <span class="field-key">MD5</span> a4188cf2b9189f82b855350233a307eb 
    </div> 
    <div class="enum"> 
     <span class="field-key">SHA1</span> c3eedd67a14810b8c639eb77ed2731e574245b2a 
    </div> 
    <div class="enum"> 
     <span class="field-key">File size</span> 
     3.8 KB (3854 bytes) 
    </div> 
</div> 

Я использую этот код:

Dim Table2 As New DataTable() 
    Table2.Columns.Add("Value1", GetType(String)) 
    Table2.Columns.Add("Value2", GetType(String)) 

    For Each row1 As HtmlNode In doc.DocumentNode.SelectNodes("//div[@id='file-details']//div[@class='enum-container']//div[@class='enum']") 
     Dim MyValue1 As HtmlNode = row1.SelectSingleNode("//span[@class='field-key']") 
     Dim MyValue2 As String = row1.InnerText 
     Table2.Rows.Add(MyValue1.InnerText, MyValue2) 
    Next 

    DataGridView3.DataSource = Table2 

Результат таков:

http://i.stack.imgur.com/vPriY.png

Вы можете видеть, что первая колонка получает повторяющееся значение (MD5).


То, что я хочу, как это:

http://i.stack.imgur.com/jlsk5.png

Спасибо.

+1

возможно дубликат [Html Agility Pack, итерация на столе узла не работает] (http://stackoverflow.com/questions/26176173/html-agility-pack-iteration-on-table-node-not-working) – har07

+0

@ har07 Я использовал это раньше. Я всегда получаю ** MD5 ** как значение во всех строках таблицы. – Tajrib

+0

@Tajrib Удалите // из того места, где вы выбираете диапазон. Вы выбираете первый диапазон в соответствующем документе. Вот почему вы получаете один и тот же узел каждый раз – Brian

ответ

0

Вы выбираете первый пролет в документе, который соответствует документу с помощью «//» xpath. Вам нужно удалить это из вашего xpath, чтобы вместо этого выбрать прямые дециенты.

C#

DataTable fileDetailsTable = new DataTable(); 
fileDetailsTable.Columns.Add("Key", typeof(string)); 
fileDetailsTable.Columns.Add("Value", typeof(string)); 

HtmlNodeCollection enumNodes = document.DocumentNode.SelectNodes("//div[@id='file-details']//div[@class='enum-container']//div[@class='enum']"); 
foreach (HtmlNode enumNode in enumNodes) 
{ 
    //Select the child span from the enum node. 
    HtmlNode fieldKeyNode = enumNode.SelectSingleNode("span[@class='field-key']"); 

    if (fieldKeyNode != null) 
    { 
     //Grab the key. 
     string fieldKey = fieldKeyNode.InnerText; 

     //Grab the value which is the field key's sibling 
     string fieldValue = fieldKeyNode.NextSibling.InnerText; 

     fileDetailsTable.Rows.Add(fieldKey, fieldValue); 
    } 
} 

VB.NET

Dim fileDetailsTable As New DataTable() 
fileDetailsTable.Columns.Add("Key", GetType(String)) 
fileDetailsTable.Columns.Add("Value", GetType(String)) 

Dim enumNodes As HtmlNodeCollection = document.DocumentNode.SelectNodes("//div[@id='file-details']//div[@class='enum-container']//div[@class='enum']") 
For Each enumNode As HtmlNode In enumNodes 
    'Select the child span from the enum node. 
    Dim fieldKeyNode As HtmlNode = enumNode.SelectSingleNode("span[@class='field-key']") 

    If fieldKeyNode IsNot Nothing Then 
     'Grab the key. 
     Dim fieldKey As String = fieldKeyNode.InnerText 

     'Grab the value which is the field key's sibling 
     Dim fieldValue As String = fieldKeyNode.NextSibling.InnerText 

     fileDetailsTable.Rows.Add(fieldKey, fieldValue) 
    End If 
Next 
+0

Работает очень хорошо. Я запомню это для будущего. Большое вам спасибо. – Tajrib

Смежные вопросы