2017-04-12 75 views
-1
WebClient client = new WebClient(); 
var data = client.DownloadString("a web link"); 

,我得到一个HTML页面,其中有这样的C# - HTML“嵌套表”类

<table> 
<tr> 
    <td> Team 1 ID </td> 
    <td> Team 1 Name </td> 
    <td> 
     <table> 
     <tr> 
      <td> Member 1 name </td> 
      <td> Member 1 age </td> 
     </tr> 
     <tr> 
      <td> Member 2 name </td> 
      <td> Member 2 age </td> 
     </tr> 
     </table> 
    </td> 
</tr> 
<tr> 
    <td> Team 2 ID </td> 
    <td> Team 2 Name </td> 
    <td> 
     <table> 
     <tr> 
      <td> Member 1 name </td> 
      <td> Member 1 age </td> 
     </tr> 
     </table> 
    </td> 
</tr> 

表,这意味着另一个表主表中的每一行中所以我把它叫做嵌套表。 什么的,现在我想这些数据进入类像这样的,每队可以有0至3个成员

,所以我寻求一个完善的解决方案,可以解决我的问题

class Team 
{ 

    public int teamID; 
    public string teamName; 
    public struct Member 
    { 
     public string memberName; 
     public int memberAge; 
    } 

    public Member member1; 
    public Member member2; 
} 

音符。 我应该使用正则表达式还是HtmlAgilityPack,或者哪种方式适用? 在此先感谢

回答

0

只需使用HtmlAgilityPack。如果遇到麻烦,我可以帮助你。

正则表达式只能匹配常规语言,但HTML是 上下文无关语言。使用HTML 上的正则表达式可以做的唯一的事情是启发式,但不适用于任何情况。它应该是 可能呈现一个HTML文件,将被任何 正则表达式错误地匹配。

Using regular expressions to parse HTML: why not?

如果您的HTML中包含任何标识符(CSS类或ID),这将是更容易

更新后的代码:这里是我的建议,以接近您的问题

 string mainURL = "your url"; 
     HtmlAgilityPack.HtmlWeb web = new HtmlAgilityPack.HtmlWeb(); 
     HtmlAgilityPack.HtmlDocument doc = web.Load(mainURL); 

     var tables = doc.DocumentNode.Descendants("table").Where(_ => _.Descendants("table").Any());//this will give you all tables which contain another table inside 
     foreach (var table in tables) 
     { 
      var rows = table.ChildNodes.Where(_ => _.Name.Equals("tr"));//get all tr children (not grand children) 
      foreach (var row in rows) 
      { 
       for (int i = 0; i < row.ChildNodes.Count; i++) 
       { 
        if (row.ChildNodes[i].Name.Equals("td")) 
        { 
         //you can put your logic here, for eg i == 0, assign it to TeamID properties etc... 
        } 
        if (row.ChildNodes[i].Name.Equals("table")) 
        { 
         //here is your logic to handle nested table 
        } 
       } 
      } 
     } 
+0

每个表具有同一类别所以不能单独识别。 好吧我正在尝试,但如果你给我这个问题的一些代码解决方案,它会很好。 –

+0

只需提供您的HTML所有可用的属性,我可以为您指出正确的方向 –

+0

<表类= “table表冷凝表镶上”> ​​类ID ​​状态 ​​时间 ​​00001 ​​打开 ​​ \t <表类= “表表冷凝表镶上”> \t \t \t \t \t​​上午08时00分 \t \t \t​​上午09时30分 \t \t \t \t \t \t \t​​8:0上午12时 \t \t \t​​9:30 AM \t \t \t –