Добрый вечер!
Проект ASP MVC.
Задача: есть адрес некого сайта в Интернете (в строковом виде). Нужно собрать ссылки на все страницы сайта.
В английской версии StackOverflow нашел способ с использованием WebClient.DownloadString. Но там задача получить весь HTML-код страницы.
(на всякий случай ссылка: https://stackoverflow.com/questions/1820991/how-to-get-the-webpage-source-in-asp-net-c#1820991
Собственно вопрос: есть ли какой-то более прямой способ собрать ссылки на все страницы сайта, чем тянуть весь HTML-код страницы и парсить его через Regex?
Asked
Active
Viewed 412 times
0
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 Answers
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
Можно и читать (в т.ч. через 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:47
-
-
один черт не поможет от динамических ссылок, только явно указанные href. – teran May 19 '17 at 23:35
-
@teran AngleSharp понимает Javascript. Не панацея в общем случае, согласен. – A K May 20 '17 at 08:35