Приветствую всех, сегодня я покажу как можно с помощью регулярных выражений отпарсить HTML страницу и получить с нее все ссылки.
WebRequest request;
try
{
request = HttpWebRequest.Create("https://www.nookery.ru/");
}catch (Exception)
{
MessageBox.Show("Ошибка загрузки страници");
return;
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
StringBuilder pagebuilder = new StringBuilder();
string line;
while ((line=reader.ReadLine())!=null)
{
pagebuilder.AppendLine(line);
}
response.Close();
reader.Close();
// richTextBox1.Text = pagebuilder.ToString();
string link= pagebuilder.ToString();
//парсинг начала
//string pattern = @"href=""(<ссылка>\S+)"">";
//Regex regul = new Regex(pattern);
//var matches = regul.Matches(link);
//foreach (Match m in matches)
//{
// richTextBox1.Text += m.Groups["ссылка"]+Environment.NewLine;
//}
string pattern = @"href=""(?<ссылка>\S+)""";
Regex regul = new Regex(pattern);
var matches = regul.Matches(link);
foreach (Match m in matches)
{
richTextBox1.Text += m.Groups["ссылка"] + Environment.NewLine;
}
}
Как видите код писался на WinForm использовался компонент richTextBox и button. Первая часть когда у нас делает запрос и по строчно считывает все строки страници. Однако я хочу заострить внимание именно на второй части кода, регулярном выражении.
string pattern = @"href=""(?<ссылка>\S+)""";
Regex regul = new Regex(pattern);
var matches = regul.Matches(link);
foreach (Match m in matches)
{
richTextBox1.Text += m.Groups["ссылка"] + Environment.NewLine;
}
В самой первой строчке кода мы создали шаблон поиска, начало которого начинается с href=» далее у нас в круглых скобках идет внутри шаблонная переменная под названием ссылка там и будет находится наш найденный линк. После скобок идет символ на который должна заканчиваться строка, это может быть кавычка или > тут надо смотреть саму страницу. Далее мы получаем коллекцию всех найденных ссылок с сайта и поочередно в цикле переберем их.
К сожалению сам шаблон не универсален, потому я приложу еще пару вариаций его, без лишнего кода.
string pattern = @"href=""(<ссылка>\S+)"">";
string pattern = @"href='(?<link>\S+)'>";
Дело в том что сайты пишутся на разных движках и формирования ссылок на них происходит автоматически, потому приходиться немного корректировать шаблон, но в целом он универсален.
Таким образом мы смогли разобраться как отпарсить сайт и найти на нем ссылки и самое главное, что нам не пришлось использовать сторонние библиотеки, а лишь возможности C#.
