Чтение содержимого сайта [дубликат]

242
20 сентября 2017, 09:34

На данный вопрос уже ответили:

  • Как распарсить HTML в .NET? 3 ответа

Есть небольшая задачка. Написать программу для чтения содержимого сайта. И дальнейшей записи этого в файл. Но желательно очистить текст от лишнего мусора.

Вот как я просто читаю всё содержимое:

string data = "Time = 12:00am temperature = 50";
var Client = new System.Net.WebClient();
Client.Credentials = System.Net.CredentialCache.DefaultCredentials;
Client.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
string text = Client.UploadString("", data);
int startIndex = text.IndexOf("<h1");
int length = text.IndexOf("Спасибо за внимание!") - startIndex;
text = text.Substring(startIndex, length);
string[] splitString = new string[] {"<p>", "</p>", "<u>", "</u>", "<i>", "</i>", "<strong>", "</strong>", "<h2>", "</h2>", "<h3>", "</h3>"};
string[] clearText = text.Split(splitString, StringSplitOptions.None);

Прокси, на случай если сайт не даст дёрнуть свои данные без авторизации. Так вот какие параметры для вытаскивания информации. Начиная с открытия тега h1 и заканчивая введённым словом/фразой, которую в консольке введёт пользователь. И всё что я вытащу, мне нужно очистить от специальных символов. То есть оставить только текст. Кто нибудь может подсказать как это можно сделать?

  1. Как считать от открытия тега h1 до введённого слова/фразы.
  2. Как очистить текст от кода html? Так же появилась 3 проблема. Бывает сползает кодировка. Пытаюсь поправить вот так вот:

    Client.Encoding = System.Text.Encoding.UTF8; Не помогает. Подскажите пожалуйста что сделать ещё и с этим.

Answer 1

Ваше решение плохо несколькими моментами:

  1. Вы используете прямую работу со строками, а не специализированные парсеры html
  2. Вы захардкодили список тегов. Их больше, вы постоянно будете их дописывать, они будут постоянно ломаться и вам придётся перекачивать сайт. Код хрупкий.
  3. Тег типа <p> вы вырежете, хорошо. А <p class="asdf" style="color:red;padding: 0 10px;"> уже нет. А внутри может быть очень много вариантов -- и вы придёте к регуляркам, сложным и плохо отлаживаемым.

Возьмите например, AngleSharp.

Он умеет скачивать сайты:

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;
}

Он умеет парсить html, для вашего случая:

    var parser = new HtmlParser();
    var document = parser.Parse(@"<html><head></head><body>
<div class='product'>
    <a href='/url1.html'><img src='img1.jpg' alt=''></a>
    Hello, world
    <div class='comments-likes'>1</div>
    <table id='menutable'>
        <tr>
            <td>Head1</td>
            <td>Head2</td>
        </tr>
        <tr>
            <td class='bla ble'>31</td>
            <td>content</td>
        </tr>
        <tr>
            <td class='bla ble'>32</td>
            <td>content</td>
        </tr>
    </table>
</div>
<div class='footer'>
    <a href='http://www.ya.ru/q=asdf'>
</div>
</body></html>");
var text = document.QuerySelector("body").TextContent;
Console.WriteLine(text);

Вывод:

Поэтому как я вижу решение вашей задачи: распарсить сайт html-парсером и получить TextContext для документа.

PS Да, это подойдёт для любого сайта.

Ставить AngleSharp проще всего через менеджер пакетов: правый клик на солюшене - Manane Nuget packages for solution. Тогда и все неймспейсы подтянутся.

READ ALSO
IO.FileSystemWatcher HDD просыпается по непонятной причине

IO.FileSystemWatcher HDD просыпается по непонятной причине

Как нужно правильно написать программу для перехвата причины, по которой HDD выходит из сна? Или как написать программу мониторинга чтения...

210
webClient возвращает 403 или 500

webClient возвращает 403 или 500

Хочу узнать данные по этой ссылке

191
Изменить размер массива через unsafe

Изменить размер массива через unsafe

Экскурс к тому, для чего нужно:

219