2014-01-13 2 views
0

Я пытаюсь читать из расписания в Интернете.HTMLAgilityPack: необходимо извлечь значение colspan и другие

Это часть HTML-кода:

<TR> 
    <TD rowspan=12 align="center" nowrap="1"> 
     <TABLE> 
      <TR> 
       <TD align="center" nowrap=1><font size="3" face="Arial"><B>Monday</B></font> 
       </TD> 
      </TR> 
     </TABLE> 
    </TD> 
    <TD colspan=2 rowspan=12 align="center" nowrap="1"> 
     <TABLE> 
      <TR> 
       <TD> 
       </TD> 
      </TR> 
     </TABLE> 
    </TD> 
    <TD colspan=6 rowspan=12 align="center" nowrap="1"> 
     <TABLE> 
      <TR> 
       <TD width="33%" nowrap=1><font size="2" face="Arial"><B>Meeting</B></font></TD> 
      </TR> 
      <TR> 
       <TD width="33%" nowrap=1><font size="2" face="Arial"><B>London</B></font></TD> 
       <TD width="33%" nowrap=1><font size="2" face="Arial">Smith</font></TD> 
      </TR> 
     </TABLE> 
    </TD> 
    <TD colspan=4 rowspan=12 align="center" nowrap="1"> 

мне удалось установить HTMLAgilityPack и реализовать этот код в настоящее время. Потомки и пропустить, кажется, хорошо до сих пор:

List<List<string>> table = doc.DocumentNode.SelectSingleNode("//table[@border='3']") 
        .Descendants("tr") 
        .Skip(1) 
        .Where(tr => tr.Elements("td").Count() >= 4) 
        .Select(tr => tr.Elements("td").Select(td => td.InnerText.Trim()).ToList()) 
        .ToList(); 

Результат таблицы что-то вроде этого:

  • [0] = "Понедельник"
  • [1] = ""
  • [2] = "Встреча \ г \ п \ г \ п \ г \ nLondon \ г \ п \ г \ п \ г \ nSmith"
  • [3] = ""
  • [4] = .. другая встреча ...

Значение colspan указывает продолжительность. Так что я задаю следующие вопросы:

Как я могу сделать значение colspan частью моего результата? Мне нужно знать, что лондонская встреча начинается через 2 раза и длится шесть единиц.

  • [0] = "Понедельник"
  • [1] = "" // Длительность перерыва составляет 2
  • [2] = «Встреча \ г \ п \ г \ п \ г \ nLondon \ r \ n \ r \ n \ r \ nSmith "// Продолжительность 6

Спасибо!

ответ

3

Захватив это анонимный тип, вероятно, самый простой:

var table = doc.DocumentNode.SelectSingleNode("//table[@border='3']") 
       .Descendants("tr") 
       .Skip(1) 
       .Where(tr => tr.Elements("td").Count() >= 4) 
       .Select(tr => tr.Elements("td") 
        .Select(td => new { Text = td.InnerText.Trim(), Duration = td.Attributes["Colspan"] != null ? td.Attributes["Colspan"].Value: "1").ToList()) 
       .ToList(); 

Или создать экземпляр кортежей:

List<List<Tuple<string, string>> table = doc.DocumentNode.SelectSingleNode("//table[@border='3']") 
       .Descendants("tr") 
       .Skip(1) 
       .Where(tr => tr.Elements("td").Count() >= 4) 
       .Select(tr => tr.Elements("td") 
        .Select(td => new Tuple<string,string>(td.InnerText.Trim(), td.Attributes["Colspan"] != null ? td.Attributes["Colspan"].Value: "1").ToList()) 
       .ToList(); 
+0

Я считаю, что вы хотите ':' вместо '' до '' 1 "' для вашего условного оператора. – Harrison

+0

@ Харрисон, ты абсолютно прав. SO должен добавить Intellisense в свой редактор;). – jessehouwing

+0

Спасибо. К сожалению, оба фрагмента не работают для меня. – user1208574

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