Приветствую всех, сегодня я покажу как можно с помощью регулярных выражений отпарсить 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#.