Определить определенную часть строки без идентификаторов? - PullRequest
0 голосов
/ 10 июля 2019

У меня проблемы с извлечением определенного значения из большой строки, возвращаемой из httpwebresponse.Ответ меняется каждый раз, когда сайт меняется, но мне нужно извлечь одно число из источника.Вот фрагмент ответа, и мне нужно извлечь «9», хотя это может быть разное число каждый раз.

Это просто фрагменты, источник на этот раз длиной 1300 строк.Это может быть в три раза больше, чем в следующий раз, и число в другом месте.Единственная константа состоит в том, что она появляется за пределами всех тегов HTML.

                </div>
              <div id="inhoud_content_rechts">
                        <div id="taalkeuze"><a href="index.php" class="taalkeuze_link_actief">EN</a> | <a href="nl/index.php" class="taalkeuze_link">NL</a> | <a href="fr/index.php" class="taalkeuze_link">FR</a> | <a href="es/index.php" class="taalkeuze_link">ES</a></div>

<div id="print_page"><a href="javascript:window.print();" class="taalkeuze_link">â┼' print this page</a></div>                    <h1 class="titel">NEWS</h1>
                    <br />

                    <h1 class="nieuws_titel">12 | 4</h1>
                    9
                    <br /><br />
                    <a href="news.php" class="content_link">Back to overview â┼'</a>
                    <br /><br />
                </div>
            </div>
        </div>

Я не могу использовать сопоставление с регулярным выражением, поскольку источник меняется каждый раз, единственный уникальный идентификатор, который я могу придумать, заключается в том, что строка находится за пределами HTMLХотя так несколько вещей.Я попытался удалить все теги HTML с помощью

System.Text.RegularExpressions.Regex regexHTML = new System.Text.RegularExpressions.Regex("<[^>]*>");
text = regexHTML.Replace(text, "");

, хотя это приводит к значительному сокращению текста, но текст по-прежнему остается, например

                        EN | NL | FR | ES

â┼' print this page                    NEWS


                    12 | 4
                    9

                    Back to overview â┼'

. Я также попробовал несколько других вещей.:

  • Преобразование всего HTML в «@», добавление каждой строки в список и пропуск строк, которые не содержат «@» - вероятно, самая успешная попытка, но строка, содержащая только число, былаЯ не пытался это сделать, я пытался удалить все пробелы и использовал isDigit / isNumber, но он возвращает false.
  • Преобразование всей строки в char и циклическое перемещение по каждой строке для поиска isDigit - та же проблема, что и выше

У кого-нибудь есть идеи, как я мог бы написать что-нибудь, что позволит извлечь нужное мне число?Я подумал, что, возможно, после удаления всего HTML-кода я смог проверить, содержит ли строка ТОЛЬКО один тип int, но не увенчался успехом с isDigit, isNumber & int.parse.Вот отредактированные строки предыдущих попыток, если они полезны.Преобразование HTML в "@" и удаление всех HTML

"@" Редактировать:

@@@@@@@@@@@@â┼' print this page@@@@@@@@@@@@                    @@@@@@NEWS@@@@@@
                    @@@@@@

                    @@@@@@12 | 4@@@@@@
                    9
                    @@@@@@@@@@@@
                    @@@@@@Back to overview â┼'@@@@@@
                    @@@@@@@@@@@@
                @@@@@@
            @@@@@@

Удаление всего HTML:

                       EN  |  NL  |  FR  |  ES

  â┼' print this page                       NEWS


                     12 | 4
                    9

                     Back to overview â┼'

TL: DR: Извлечь числокоторый всегда появлялся за пределами HTML без других идентификаторов, он был отдельной строкой.

1 Ответ

0 голосов
/ 10 июля 2019

Что-то вроде этого:

  int? number = html.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
    .Select(l =>
    {
      l = l.Trim();
      if (l.Length == 1 && int.TryParse(l, out int num))
        return (int?)num;
      return null;
    }).FirstOrDefault(n => n != null);

  Console.WriteLine(number);

Когда я читаю вопрос, это одна цифра - отсюда и проверка l.Length == 1. Если это может быть любое число, вы можете опустить проверку длины.

Это работает, если искомый номер находится в отдельной строке.


Альтернатива с использованием Regex:

  Match match = Regex.Match(html, @"</.+>\s*\n*(?<num>\d+)\s*\n*<.+>");
  if (match.Success)
    Console.WriteLine(match.Groups["num"]);

Шаблон находит число между закрывающим тегом: </xxxx> и открывающим тегом: <xxx> и любые пробелы и / или новые строки допускаются между ними.

Работает для чисел, находящихся в строках с или без html

...