Как я могу прочитать содержимое параметра url по ссылке на веб-странице?

В настоящее время я создаю консольное приложение C# с HtmlAgilityPack, где я пытаюсь получить значение параметра ссылки, которая находится на веб-странице. Итак, в основном у меня есть веб-страница, на которой есть множество ссылок. И в одной из ссылок есть параметр "&pagenumber=[some number]". Я пытаюсь получить значение после &pagenumber= и сохранить его в переменной типа int.

Шаги:

  1. Перейти на сайт (http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1)

  2. Найдите текст «Последняя страница» в URL-адресе внизу страницы:

<a href = "http://forum.tibia.com/forum/?action=board&amp;boardid=25&amp;threadage=-1&amp;pageitems=30&amp;pagenumber=974">Last Page</a>

  1. Возьмите значение параметра из "номера страницы" (в данном случае "974")

  2. Сохраните его в целочисленной переменной

Мой код на данный момент:

string PageLink = "http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1";
Task.Run(async () =>
{
    using (var client = new HttpClient())
    {
        // Load the html of the page
        var html = await client.GetStringAsync(PageLink);
        var document = new HtmlAgilityPack.HtmlDocument();
        document.LoadHtml(html);

        // Find the "Last Page" link at bottom of page
        var lastPageLink = document.DocumentNode.Descendants("a").First(x => x.Attributes["href"].Value.Contains("&amp;threadage=-1&amp;pageitems=30&amp;pagenumber = ")).InnerHtml;

        // Print out the pagenumber value
        Console.WriteLine(lastPageLink);
    }
}).Wait(1000);

Однако мой код ничего не печатает, поэтому мне интересно, что я здесь делаю не так. Я не получаю никаких ошибок. Я в основном пытался найти все ссылки (a-tag), смотрю на их значение "href" и смотрю, содержит ли оно "& threadage = -1 & pageitems = 30 & pagenumber =". И если это так, он должен выбрать его html-код.

Итак, прямо сейчас я хочу напечатать мой код: http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1&pageitems=30&pagenumber=974

Затем я могу перейти к использованию Regex или чего-то еще, чтобы получить "974".

Очень важно, чтобы URL содержал «board & boardid = 25 & threadage = -1», потому что есть и другие ссылки со значением «Последняя страница» в нем.

Task.Run(async () =>...).Wait(1000); выглядит не так. Не уверен, что это причина вашей проблемы. Я предполагаю, что вы сделали это, потому что вам нужен неасинхронный хук для вашей консоли. Сделай это вместо этого
Liam 06.06.2018 17:29

Что ж, сначала мне нужно получить значения. Так что сейчас я бы даже не сосредоточился на .Wait (). Дело в том, что я не могу получить никакой пользы от ссылки. И я пытаюсь понять, что я там делаю не так. Разве мне не следует искать ссылки "a", проверять, содержит ли "href" этот текст, а затем возвращать все значение href?

Lee Cheung 06.06.2018 17:32

Если я запускаю этот код, задача генерирует исключения с нулевой ссылкой, потому что во многих случаях x.Attributes["href'] имеет значение NULL.

Shelby115 06.06.2018 17:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
var lastPageLink = document.DocumentNode.Descendants("a").First(x => x.Attributes["href"] != null && x.Attributes["href"].Value.Contains("&amp;threadage=-1&amp;pageitems=30&amp;pagenumber = ")).Attributes["href"].Value;

Два изменения,

  1. Я добавил x.Attributes["href"] != null && в начало лямбда-выражения, чтобы предотвратить NullReferenceException, когда ссылка не имеет атрибута href.
  2. Переключен .InnerHtml на .Attributes["href"].Value, чтобы печатать URL вместо Last Page.

Парсинг

var matchingString = "&amp;threadage=-1&amp;pageitems=30&amp;pagenumber = ";
var start = lastPageLink.IndexOf(matchingString) + matchingString.Length;
var end = lastPageLink.Length - start;
var pageNumber = lastPageLink.IndexOf(matchingString) >= 0 ? lastPageLink.Substring(start, end) : "Unknown";
Console.WriteLine("Page #: " + pageNumber);

Должен получить то, что вы хотите. Я не знаю регулярного выражения, поэтому, если вы хотите его использовать, вам придется выяснить это самостоятельно.

ПРИМЕЧАНИЕ: Я сделал предположение, что номер страницы будет последним параметром URL-адреса, что не всегда верно. Поэтому, если вы используете этот код не только для краткосрочного использования, я бы скорректировал его соответствующим образом.

Я пытаюсь получить href для последней страницы. Не фактический текст «Последняя страница», а ссылка. А точнее, я пытаюсь получить только значение после "& pagenumber = " в этом href. Но я думаю, что первый шаг - получить полную ссылку.

Lee Cheung 06.06.2018 17:37

Обновлено: я вижу, вы обновили свой пост. Это хорошо работает! Спасибо! Теперь я получаю полный href. Теперь мне просто нужно попытаться найти только значение номера страницы. Есть ли способ сделать это прямо в том же коде? Или мне нужно сохранить значение href в строке, а затем использовать Regex, чтобы найти номер страницы = XXXXX

Lee Cheung 06.06.2018 17:38

В общем, в этом случае я пытаюсь получить на выходе «974». Вместо всего значения href

Lee Cheung 06.06.2018 17:41

@LeeCheung Да, если вы хотите использовать регулярное выражение, вы просто возьмете строковую версию URL-адреса (например, lastPageLink) и пропустите ее.

Shelby115 06.06.2018 17:48

Мне удалось получить это с помощью этой строчки: var lastPageValue = lastPageLink.Split('=').Last();

Lee Cheung 06.06.2018 17:48

Спасибо за помощь! Вы решили мою большую большую проблему с кодом. Реп ++ !!!!

Lee Cheung 06.06.2018 17:49

Ваш метод синтаксического анализа не обязательно будет работать всегда, параметры URL-адреса не обязательно должны быть в одном и том же порядке каждый раз, кстати. Однако в краткосрочной перспективе это должно сработать. Тем не менее, я полагаю, что мой предполагает, что это слишком долго, lol.

Shelby115 06.06.2018 17:49

О да, ты прав. Порядок можно изменить в href.

Lee Cheung 06.06.2018 17:52

Другие вопросы по теме