В настоящее время я создаю консольное приложение C# с HtmlAgilityPack, где я пытаюсь получить значение параметра ссылки, которая находится на веб-странице. Итак, в основном у меня есть веб-страница, на которой есть множество ссылок. И в одной из ссылок есть параметр "&pagenumber=[some number]". Я пытаюсь получить значение после &pagenumber= и сохранить его в переменной типа int.
Шаги:
Перейти на сайт (http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1)
Найдите текст «Последняя страница» в URL-адресе внизу страницы:
<a href = "http://forum.tibia.com/forum/?action=board&boardid=25&threadage=-1&pageitems=30&pagenumber=974">Last Page</a>
Возьмите значение параметра из "номера страницы" (в данном случае "974")
Сохраните его в целочисленной переменной
Мой код на данный момент:
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("&threadage=-1&pageitems=30&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», потому что есть и другие ссылки со значением «Последняя страница» в нем.
Что ж, сначала мне нужно получить значения. Так что сейчас я бы даже не сосредоточился на .Wait (). Дело в том, что я не могу получить никакой пользы от ссылки. И я пытаюсь понять, что я там делаю не так. Разве мне не следует искать ссылки "a", проверять, содержит ли "href" этот текст, а затем возвращать все значение href?
Если я запускаю этот код, задача генерирует исключения с нулевой ссылкой, потому что во многих случаях x.Attributes["href'] имеет значение NULL.





var lastPageLink = document.DocumentNode.Descendants("a").First(x => x.Attributes["href"] != null && x.Attributes["href"].Value.Contains("&threadage=-1&pageitems=30&pagenumber = ")).Attributes["href"].Value;
Два изменения,
x.Attributes["href"] != null && в начало лямбда-выражения, чтобы предотвратить NullReferenceException, когда ссылка не имеет атрибута href..InnerHtml на .Attributes["href"].Value, чтобы печатать URL вместо Last Page.Парсинг
var matchingString = "&threadage=-1&pageitems=30&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. Но я думаю, что первый шаг - получить полную ссылку.
Обновлено: я вижу, вы обновили свой пост. Это хорошо работает! Спасибо! Теперь я получаю полный href. Теперь мне просто нужно попытаться найти только значение номера страницы. Есть ли способ сделать это прямо в том же коде? Или мне нужно сохранить значение href в строке, а затем использовать Regex, чтобы найти номер страницы = XXXXX
В общем, в этом случае я пытаюсь получить на выходе «974». Вместо всего значения href
@LeeCheung Да, если вы хотите использовать регулярное выражение, вы просто возьмете строковую версию URL-адреса (например, lastPageLink) и пропустите ее.
Мне удалось получить это с помощью этой строчки: var lastPageValue = lastPageLink.Split('=').Last();
Спасибо за помощь! Вы решили мою большую большую проблему с кодом. Реп ++ !!!!
Ваш метод синтаксического анализа не обязательно будет работать всегда, параметры URL-адреса не обязательно должны быть в одном и том же порядке каждый раз, кстати. Однако в краткосрочной перспективе это должно сработать. Тем не менее, я полагаю, что мой предполагает, что это слишком долго, lol.
О да, ты прав. Порядок можно изменить в href.
Task.Run(async () =>...).Wait(1000);выглядит не так. Не уверен, что это причина вашей проблемы. Я предполагаю, что вы сделали это, потому что вам нужен неасинхронный хук для вашей консоли. Сделай это вместо этого