0
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Text;

WebClient client = new WebClient();
string page = client.DownloadString(new Uri("https://bigenc.ru/contacts"));
File.WriteAllText(@"c:\page.txt",page);


using (WebScanner scanner = new WebScanner())
{

    scanner.TargetFound += (page, links) =>
    {
        Console.WriteLine($"\nPage:\n\t{page}\nLinks:");
        foreach (var link in links)
            Console.WriteLine($"\t{link}");
    };
    scanner.Scan(new Uri("https://bigenc.ru/contacts"),10);
    Console.WriteLine("Done.");
}

public class WebScanner : IDisposable
{
    private readonly HashSet<Uri> _procLinks = new HashSet<Uri>();
    private readonly WebClient _webClient = new WebClient();

    private readonly HashSet<string> _ignoreFiles = new HashSet<string> {".ico",".xml" };

    private void OnTargetFound(Uri page, Uri[] links)
    {
        TargetFound?.Invoke(page, links);

    }

    private void Process(string domain,Uri page, int count)
    {
        if(count<=0) return;

        if (_procLinks.Contains(page)) return;
        _procLinks.Add(page);

        string html = _webClient.DownloadString(page);


        //Поиск почты
        var hrefs = (from href in Regex.Matches(html, @"class=""[\w\s\-\>\""\<\а-яА-Я\]+""").Cast<Match>() 
                     let url = href.Value.Replace("class=","").Trim('"')
                     let loc = url.StartsWith("/")
                     select new
                     {
                         Ref = new Uri(loc ?$"{domain}{url}" : url),
                         IsLocal = loc || url.StartsWith(domain)
                     }
                     ).ToList();


        var externals = (from href in hrefs
                         where !href.IsLocal
                         select href.Ref).ToArray();

        if (externals.Length > 0) OnTargetFound(page, externals);

        var locals = (from href in hrefs
                      where href.IsLocal
                      select href.Ref).ToList();


        foreach (var href in locals)
        {
            string fileEx = Path.GetExtension(href.LocalPath).ToLower();
            if (_ignoreFiles.Contains(fileEx)) continue;

            Process(domain, href, --count);

        }
    }



    public event Action<Uri, Uri[]> TargetFound;



    public void Scan(Uri startPage, int pageCount)
    {
        _procLinks.Clear();

        string domain = $"{startPage.Scheme}://{startPage.Host}";
        Process(domain, startPage, pageCount);

    }


    public void Dispose()
    {
        _webClient.Dispose();
    }

}

Не получается получить названия страницы,как правильно написать это регулярное выражение?@"class=""[\w\s->""<\а-яА-Я]+"""

Вот такую ошибку выдаёт Unhandled exception. System.Text.RegularExpressions.RegexParseException: Invalid pattern

  • WebClient является устаревшим в C#, это можете узнать в документации. А так, HTML не парсят регулярками, как и через что - можете почитать тут. – EvgeniyZ Nov 22 '22 at 18:20
  • 1
    Ставите HtmlAgilityPack или AngleSharp и радуетесь. – aepot Nov 22 '22 at 18:22
  • Понял,спасибо за наводку! – Raerdre Nov 22 '22 at 18:25
  • Поверх первого я ставлю еще плагин Fizzler.Systems.HtmlAgilityPack и делаю так string hrefs = doc.DocumentNode.QuerySelectorAll("a[href]").Select(node => node.Attributes["href"].Value).ToArray();. Плагин нужен потому что не люблю XPath (.SelectNodes), но кому что больше нравится. – aepot Nov 22 '22 at 18:28
  • По поводу регулярок, есть сайт regex101.com, поможет разобраться – aepot Nov 22 '22 at 18:29
  • Хорошо,спасибо большое – Raerdre Nov 22 '22 at 18:30

0 Answers0