2011-12-12 44 views
1

我试图解析以下HTML解析不正确HTML:与HtmlAgilityPack

<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

嗯,奇怪。只需下载最新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。

+0

嗯,调查一下我看到,我得到所有程序与新闻类别,然后所有程序与纸箱类别,然后再次所有程序与音乐类别...奇怪 – Kobe