Приветствую всех, сегодня я покажу как можно с помощью регулярных выражений отпарсить HTML страницу и получить с нее все ссылки.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
WebRequest request; try { request = HttpWebRequest.Create("http://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. Первая часть когда у нас делает запрос и по строчно считывает все строки страници. Однако я хочу заострить внимание именно на второй части кода, регулярном выражении.
1 2 3 4 5 6 7 |
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=» далее у нас в круглых скобках идет внутри шаблонная переменная под названием ссылка там и будет находится наш найденный линк. После скобок идет символ на который должна заканчиваться строка, это может быть кавычка или > тут надо смотреть саму страницу. Далее мы получаем коллекцию всех найденных ссылок с сайта и поочередно в цикле переберем их.
К сожалению сам шаблон не универсален, потому я приложу еще пару вариаций его, без лишнего кода.
1 |
string pattern = @"href=""(<ссылка>\S+)"">"; |
1 |
string pattern = @"href='(?<link>\S+)'>"; |
Дело в том что сайты пишутся на разных движках и формирования ссылок на них происходит автоматически, потому приходиться немного корректировать шаблон, но в целом он универсален.
Таким образом мы смогли разобраться как отпарсить сайт и найти на нем ссылки и самое главное, что нам не пришлось использовать сторонние библиотеки, а лишь возможности C#.