Разбор неверного HTML с HtmlAgilityPack - PullRequest
1 голос
/ 12 декабря 2011

Я пытаюсь разобрать следующий HTML:

<li>
    <b style="font-size: 11px;">News:</b>
    <ul>
        <li><a style="font-size: 11px;" title="Program 1">program1</a></li>
        <li><a style="font-size: 11px;" title="Program 2">program2</a></li>
        <li><a style="font-size: 11px;" title="Program 3">program3</a></li>
    </ul>
</li>

<li>
    <b style="font-size: 11px;">Cartoons:</b>
    <ul>
        <li><a style="font-size: 11px;" title="Program 4">program4</a></li>
        <li><a style="font-size: 11px;" title="Program 5">program5</a></li>
        <li><a style="font-size: 11px;" title="Program 6">program6</a></li>
    </ul>
</li>

<li>
    <b style="font-size: 11px;">Music:</b>
    <ul>
        <li><a style="font-size: 11px;" title="Program 7">program7</a></li>
        <li><a style="font-size: 11px;" title="Program 8">program8</a></li>
        <li><a style="font-size: 11px;" title="Program 9">program9</a></li>                     
    </ul>
</li>

То, что я хочу получить, - это тип программы (внутренний текст) и название программ (внутренний текст).

Результаты я хочу поместить их в следующий объект:

public class Programs
{
   public string Name { get; set; }
   public string Category { get; set; }
}

Это мой текущий код:

var content = from li in document.DocumentNode.Descendants("li")
                          from b in li.Descendants("b")
                          from a in li.Descendants("a")
                          where a.Attributes["title"] != null && a.Attributes["title"].Value.StartsWith("Program")
                          select new Channel
                          {
                              Name = a.InnerText,
                              Category = b.InnerText
                          };

            foreach (Programs c in content)
            {
                string s = c.Name;
                string ss = c.Category;
            }

Но для каждой программы я получаю только категорию "Новости".
Как мне сделать, чтобы получить правильные категории? (Новости - программа1, программа2, программа3, Мультфильмы - программа4, программа5, программа6 ...).

1 Ответ

1 голос
/ 12 декабря 2011

Хм, странно. Просто скачал последнюю HtmlAgilityPack и попробовал ваш пример, и он дал мне правильные результаты:

News:: program1
News:: program2
News:: program3
Cartoons:: program4
Cartoons:: program5
Cartoons:: program6
Music:: program7
Music:: program8
Music:: program9

Мой тестовый код:

 var htmlDoc = new HtmlDocument();
 htmlDoc.Load("test.txt");
 var items = from li in htmlDoc.DocumentNode.Descendants("li")
             from b in li.Descendants("b")
             from a in li.Descendants("a")
             where a.Attributes["title"] != null && 
             a.Attributes["title"].Value.StartsWith("Program")
             select new
             {
               Name = a.InnerText,
               Category = b.InnerText
             };

 foreach (var item in items)
 {
   Console.WriteLine("{0}: {1}", item.Category, item.Name);
 }
 Console.ReadKey();

Полагаю, вы упустили что-то простое в своем коде. Кстати, файл 'test.txt' содержит выше HTML.

...