0

Добрый вечер!
Проект ASP MVC.
Задача: есть адрес некого сайта в Интернете (в строковом виде). Нужно собрать ссылки на все страницы сайта.
В английской версии StackOverflow нашел способ с использованием WebClient.DownloadString. Но там задача получить весь HTML-код страницы. (на всякий случай ссылка: https://stackoverflow.com/questions/1820991/how-to-get-the-webpage-source-in-asp-net-c#1820991
Собственно вопрос: есть ли какой-то более прямой способ собрать ссылки на все страницы сайта, чем тянуть весь HTML-код страницы и парсить его через Regex?

foxhound
  • 460
  • 1
    вам даже этот способ не даст всех ссылок в общем случае – teran May 19 '17 at 19:42
  • Из серии "Как мне узнать, что написано в файле на диске не читая его?" – A K May 19 '17 at 19:48
  • @teran: Вот именно, что у меня не всегда этот способ нормально работал. Списывал на свои кривые руки. – foxhound May 19 '17 at 20:35
  • @A K: Ладно прочитать, меня больше интересовал вопрос, не пытаюсь ли я изобрести какой-нибудь стандартный класс Майкрософта. – foxhound May 19 '17 at 20:38

1 Answers1

0

Для парсинга сайтов в c# сейчас пользуются AngleSharp, очень хорошая библиотека, рекомендую.

Это гораздо правильнее, чем варварски парсить текст регулярками.

var parser = new HtmlParser();
var document = parser.Parse(@"<body>
<div class='product'>
    <a href='/url1.html'><img src='img1.jpg' alt=''></a>
    Hello, world
    <div class='comments-likes'>1</div>
</div>
<div class='footer'>
    <a href='http://www.ya.ru/q=asdf'>
</div>
</body>");

var links = document.QuerySelectorAll("a");
foreach (var link in links)
{
    var url = link.GetAttribute("href");
    url.Dump();
}

Вывод:

/url1.html

http://www.ya.ru/q=asdf

Можно и читать (в т.ч. через async/await) страницу:

private static IDocument GetPage(Url url)
{
    var config = Configuration.Default.WithDefaultLoader();
    var document = BrowsingContext.New(config).OpenAsync(url).Result;
    if (document.StatusCode != HttpStatusCode.OK)
        throw new Exception($"Bad document status: {document.StatusCode}");
    return document;
}
A K
  • 28,718
  • Задача: обойти сайт, собрав ссылки на все его страницы. – foxhound May 19 '17 at 20:40
  • Как раз я и искал альтернативу регуляркам. Я сделал с их помощью, но код мне не понравился. – foxhound May 19 '17 at 20:47
  • @foxhound ОК, убрал лишнее из ответа. – A K May 19 '17 at 21:24
  • один черт не поможет от динамических ссылок, только явно указанные href. – teran May 19 '17 at 23:35
  • @teran AngleSharp понимает Javascript. Не панацея в общем случае, согласен. – A K May 20 '17 at 08:35