Задать вопрос

Как парсить HTML при помощи HttpClient?

Здравствуйте.

Мне необходимо выполнить парсинг данных их HTML. Для этого мною используется следующий программный код (C#.NET):
string pathToHtml = "ссылка";
WebClient client = new WebClient();
var data = client.DownloadData(pathToHtml);
var html = Encoding.UTF8.GetString(data);

// Создание экземпляра локальной переменной «doc».
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

// Загрузка HTML кода в локальную переменную «doc».
doc.LoadHtml(html);

var x = doc.DocumentNode.SelectNodes("XPATH выражение").Elements("tr").ToList();

Вышеприведенный программный код на моем компьютере работает хорошо.

У меня возникла потребность использовать этот программный код в .NET Core. Но дело в том, что WebClient не поддерживается в .NET Core: stackoverflow.com. Для .NET Core нужно (возможно не обязательно) использовать HttpClient.

Я попробовал переписать код разными способами, которые находил в интернете, но у меня код не заработал.

Я хотел бы попросить показать простой пример рабочего кода парсинга HTML с помощью HttpClient.

P.S. У HtmlAgilityPack существует версия под .NET Core (называется HtmlAgilityPack.NetCore), поэтому Agility под .NET Core работает хорошо.
P.P.S. Я малоопытный.
  • Вопрос задан
  • 5061 просмотр
Подписаться 2 Средний Комментировать
Решения вопроса 2
tomnolane
@tomnolane
профессиональный разработчик
способов много, но предложу использовать универсальный, пусть это и костыль, но много место не занимает, дополнительные (сторонние библиотеки не нужны...):
using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    public static class Program
    {
        private static string html = "Ошибка";

        private static void Main()
        {
            ShowTags("https://www.yandex.ru/","a");
            Console.ReadKey();
        }

        private static async void ShowTags(string my_url, string tag = "a") // Тег по умолчанию для поиска, ищем теги <a></a>
        { 
            // Загружем страницу 
           string data = await GetHtmlPageText(my_url);

           if (!data.Contains("Ошибка"))
            { 
                string pattern = string.Format(@"\<{0}.*?\>(?<tegData>.+?)\<\/{0}\>", tag.Trim());
                // \<{0}.*?\> - открывающий тег
                // \<\/{0}\> - закрывающий тег
                // (?<tegData>.+?) - содержимое тега, записываем в группу tegData

                Regex regex = new Regex(pattern, RegexOptions.ExplicitCapture);
                MatchCollection matches = regex.Matches(data);

                foreach (Match matche in matches)
                {
                    Console.WriteLine(matche.Value);
                    Console.WriteLine("Содержание:");
                    Console.WriteLine(matche.Groups["tegData"].Value);
                    Console.WriteLine("---------------------------");
                } 
            }
            else
            {
                Console.WriteLine("Ошибка при загрузке со страницы: " + my_url);
            }
        }

        private static async Task<string> GetHtmlPageText(string url)
        {  
            await Task.Run(async()=>{
               
                // ... используем HttpClient.
                using (HttpClient client = new HttpClient())
                using (HttpResponseMessage response = await client.GetAsync(url))
                using (HttpContent content = response.Content)
                {
                    // ... записать ответ
                    string result = await content.ReadAsStringAsync();
                    if (html != null)
                    {
                        html = result;
                    }
                } 
            });
            return html;
        }
    }
}


результат на примере yandex.:
<a href="http://mail.yandex.ru"onclick="c(this,17,1080)">Войти&nbsp;в&nbsp;почту</a>
Содержание:
Войти&nbsp;в&nbsp;почту


Regex работает быстрее чем остальные парсеры
Ответ написан
@ERAFY Автор вопроса
У меня еще при помощи HttpWebRequest получилось сделать:
HttpWebRequest http = (HttpWebRequest)WebRequest.Create(pathToHtml);
        WebResponse response = http.GetResponse();
        Stream stream = response.GetResponseStream();
        StreamReader sr = new StreamReader(stream);
        string html = sr.ReadToEnd();

        // Создание экземпляра локальной переменной «doc».
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();

        // Загрузка HTML кода в локальную переменную «doc».
        doc.LoadHtml(html);

        var x = doc.DocumentNode.SelectNodes(pathToHTMLTextNode).Elements("tr").ToList();

Может кому пригодиться в будущем.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы