2016-12-21 2 views
1

Я работаю над приложением, которое экстракты содержимое страницы игры (example), отображает его пользователю в текстовом поле, и если пользователь хочет сделайте это, он может сохранить его как .txt-файл или .xsl (формат Excel).Эффективный способ увеличить «код» на 1 - HtmlAgilityPack

Но главная проблема я столкнулся прямо сейчас, что вы должны вручную изменить код для «извлечь» данные о другом блоке в игре.

Если открыть ссылку вы увидите, что я в настоящее время извлечения «Оружие», «Б», «Выжил» и «Потери» со стороны Defender (как сейчас), но только «1 тип единицы» (более всего одна строка этой таблицы) «извлекается», Я ищу способ поиска «tr [1]/td [2]/span [ 1] "через" tr [45]/td [2]/span [1] "(даже если примерная страница работает только до tr [16]) или, возможно, способ автоматизировать ее поиск до тех пор, пока не найдет данные (ничего), тогда это остановится.

Извините за любые текстовые ошибки, я не носитель языка

private void btnStart_Click(object sender, RoutedEventArgs e) 
    { 
     HtmlDocument brPage = new HtmlWeb().Load("http://us.desert-operations.com/world2/battleReport.php?code=f8d77b1328c8ce09ec398a78505fc465"); 
     HtmlNodeCollection nodes = brPage.DocumentNode.SelectNodes("/html[1]/body[1]/div[1]/div[1]/div[3]/div[1]/div[1]/div[1]/div[2]/table[2]"); 
     string result = ""; 
     List<brContentSaver> ContentList = new List<brContentSaver>(); 
     foreach (var item in nodes) 
     { 
      brContentSaver cL = new brContentSaver(); 
      /* Here comes the junk handler, replaces all junk for nothing, essentially deleting it 
       I wish I knew a way to do this efficiently */ 
      cL.Weapons = item.SelectSingleNode("tr[16]/td[1]").InnerText 
       .Replace("&nbsp;*&nbsp;", " ") 
       .Replace("&nbsp ; *&nbsp ;", " "); 

      cL.Used = item.SelectSingleNode("tr[16]/td[2]/span[1]").InnerText 
       .Replace("&nbsp;*&nbsp;", " ") 
       .Replace("&nbsp ; *&nbsp ;", " "); 

      cL.Survived = item.SelectSingleNode("tr[16]/td[3]").InnerText 
       .Replace("&nbsp;*&nbsp;", " ") 
       .Replace("&nbsp ; *&nbsp ;", " "); 

      if (cL.Survived == "0") 
      { 
       cL.Casualties = cL.Used; 
      } else 
      { 
       /* int Casualties = int.Parse(cL.Casualties); 
       * int Used = int.Parse(cL.Used); 
       * int Survived = int.Parse(cL.Survived); 

       * Casualties = Used - Survived; */ 

       cL.Casualties = item.SelectSingleNode("tr[16]/td[4]").InnerText 
       .Replace("&nbsp;*&nbsp;", " ") 
       .Replace("&nbsp ; *&nbsp ;", " "); 
      } 

      ContentList.Add(cL); 
     } 

     foreach (var item in ContentList) 
     { 
      result += item.Weapons + " " + item.Used + " " + item.Survived + " " + item.Casualties + Environment.NewLine; 
     } 
     brContent.Text = result; 

    } 

Извините, если это звучит глупо, но я новичок в программировании, особенно в C#.

Edit 1: Я заметил, что «если (cL.Survived ==„0“)», я просто тестирование вещи некоторые вещи путь раньше, и я забыл изменить его, но эй, это работает

Edit 2: Если вы хотите знать, я также использую это:

public class brContentSaver 
{ 

    public string Weapons 
    { 
     get; 
     set; 
    } 

    public string Used 
    { 
     get; 
     set; 
    } 

    public string Survived 
    { 
     get; 
     set; 
    } 
    public string Casualties 
    { 
     get; 
     set; 
    } 
} 

ответ

0

у меня нет много времени, чтобы написать это, но надеюсь, что это поможет, если вам все еще нужно. Я считаю, что Linq удобнее:

private static void Run() 
{ 
    HtmlDocument brPage = new HtmlWeb().Load("http://us.desert-operations.com/world2/battleReport.php?code=f8d77b1328c8ce09ec398a78505fc465"); 
    var nodes = brPage.DocumentNode.Descendants("table").Where(_ => _.Attributes["class"] != null && _.Attributes["class"].Value != null && _.Attributes["class"].Value.Contains("battleReport")); 
    string result = ""; 
    List<brContentSaver> ContentList = new List<brContentSaver>(); 
    foreach (var item in nodes) 
    { 
     if (item.Descendants("th").Any(_ => _.InnerText.Equals("Weapons"))) 
     { 
      //get all tr nodes except first one (header) 
      var trNodes = item.Descendants("tr").Skip(1); 
      foreach (var node in trNodes) 
      { 
       brContentSaver cL = new brContentSaver(); 
       var tds = node.Descendants("td").ToArray(); 
       /* Here comes the junk handler, replaces all junk for nothing, essentially deleting it 
        I wish I knew a way to do this efficiently */ 
       cL.Weapons = tds[0].InnerText 
        .Replace("&nbsp;*&nbsp;", " ") 
        .Replace("&nbsp ; *&nbsp ;", " "); 

       cL.Used = tds[1].Descendants("span").FirstOrDefault()?.InnerText 
        .Replace("&nbsp;*&nbsp;", " ") 
        .Replace("&nbsp ; *&nbsp ;", " "); 
       if (string.IsNullOrEmpty(cL.Used)) 
       { 
        cL.Used = tds[1].InnerText; 
       } 

       cL.Survived = tds[2].Descendants("span").FirstOrDefault()?.InnerText 
        .Replace("&nbsp;*&nbsp;", " ") 
        .Replace("&nbsp ; *&nbsp ;", " "); 

       if (string.IsNullOrEmpty(cL.Survived)) 
       { 
        cL.Casualties = cL.Used; 
       } 
       else 
       { 
        /* int Casualties = int.Parse(cL.Casualties); 
        * int Used = int.Parse(cL.Used); 
        * int Survived = int.Parse(cL.Survived); 

        * Casualties = Used - Survived; */ 

        cL.Casualties = tds[3].Descendants("span").FirstOrDefault()?.InnerText 
        .Replace("&nbsp;*&nbsp;", " ") 
        .Replace("&nbsp ; *&nbsp ;", " "); 

        if (string.IsNullOrEmpty(cL.Casualties)) 
        { 
         cL.Casualties = tds[3].InnerText; 
        } 
       } 

       ContentList.Add(cL); 
      } 
     } 
    } 

    foreach (var item in ContentList) 
    { 
     result += item.Weapons + " " + item.Used + " " + item.Survived + " " + item.Casualties + Environment.NewLine; 
    } 
    var text = result; 

} 
+0

Спасибо, сэр, я изменил через несколько дней после того, как никто не ответил, но это будет отлично !. –