用HtmlAgilityPack解析不正确的html

时间:2011-12-12 15:16:28

标签: c# linq html-parsing html-agility-pack

我正在尝试解析以下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;
            }

但对于每个节目,我只获得“新闻”类别 我该怎么做才能获得正确的类别? (新闻 - program1,program2,program3,Cartoons - program4,program5,program6 ......)。

1 个答案:

答案 0 :(得分:1)

嗯,奇怪。刚下载了最新的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。