HTMLAgilitiPack - usuwanie znacznika

0

Witam, robię czytnik RSS'a, mam listę wiadomości i jak kliknę to funkcja przechwytuję urla i go parsuje. Następnie chcę wyciągnąć z pełnej wiadomości tylko znacznik <article></article>. I tu wszystko spoko dostaję cały znacznik article, jednakże dostaję też nie pożądane znaczniki które znajdują się wewnątrz znacznika article np jest cos takiego:

<article>
	<h2></h2>
	<aside></aside>
	<p></p>
	<p></p>
	<h2></h2>
	<aside></aside>
	<p></p>
</article>

I teraz chciałbym usunąć z tego znaczniki aside a zostawić tylko czysty tekst. Na chwilę obecna mój kod wygląda tak

HttpClient http = new HttpClient();
            var response = await http.GetByteArrayAsync("http://www.tvn24.pl/wiadomosci-ze-swiata,2/pierwsza-podroz-zagraniczna-trumpa,736985.html");
            String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
            source = WebUtility.HtmlDecode(source);
            HtmlDocument resultat = new HtmlDocument();
            resultat.LoadHtml(source);

            List<HtmlNode> articleMarker = resultat.DocumentNode.Descendants().Where
                (x => (x.Name == "article")).ToList();
            List<HtmlNode> asideRemove = new List<HtmlNode>();

            foreach (var item in articleMarker)
            {
                var asideRemove1 = item.Descendants("aside").ToList();
                foreach (var item1 in asideRemove1)
                {
                    if (asideRemove1 != null)
                    {
                        asideRemove.Add(item1);
                    }
                }
	     }
//tu powinnoi usuwać znaczniki aside z listy jednak tego nie robi ...

	foreach (var item in asideRemove)
            {
                articleMarker.Remove(item);
            }
1
Marcino24 napisał(a):

Witam, robię czytnik RSS'a, mam listę wiadomości i jak kliknę to funkcja przechwytuję urla i go parsuje. Następnie chcę wyciągnąć z pełnej wiadomości tylko znacznik <article></article>. I tu wszystko spoko dostaję cały znacznik article, jednakże dostaję też nie pożądane znaczniki które znajdują się wewnątrz znacznika article np jest cos takiego:

<article>
	<h2></h2>
	<aside></aside>
	<p></p>
	<p></p>
	<h2></h2>
	<aside></aside>
	<p></p>
</article>

I teraz chciałbym usunąć z tego znaczniki aside a zostawić tylko czysty tekst. Na chwilę obecna mój kod wygląda tak

HttpClient http = new HttpClient();
            var response = await http.GetByteArrayAsync("http://www.tvn24.pl/wiadomosci-ze-swiata,2/pierwsza-podroz-zagraniczna-trumpa,736985.html");
            String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
            source = WebUtility.HtmlDecode(source);
            HtmlDocument resultat = new HtmlDocument();
            resultat.LoadHtml(source);

            List<HtmlNode> articleMarker = resultat.DocumentNode.Descendants().Where
                (x => (x.Name == "article")).ToList();
            List<HtmlNode> asideRemove = new List<HtmlNode>();

            foreach (var item in articleMarker)
            {
                var asideRemove1 = item.Descendants("aside").ToList();
                foreach (var item1 in asideRemove1)
                {
                    if (asideRemove1 != null)
                    {
                        asideRemove.Add(item1);
                    }
                }
	     }
//tu powinnoi usuwać znaczniki aside z listy jednak tego nie robi ...

	foreach (var item in asideRemove)
            {
                articleMarker.Remove(item);
            }

Klasa HtmlNode ma takie właściwości jak InnerHtml i InnerText. InnerHtml ma w sobie znaczniki wewnątrz, a InnerText sam tekst.

Spróbuj:

List<HtmlNode> articleMarker = resultat.DocumentNode.Descendants().Where(x => (x.Name == "article")).ToList();

foreach(var article in articleMarker)
    Console.WriteLine(article.InnerText);

Ewentualnie żeby wszystko inne oprócz tego aside wyrzucło:

List<HtmlNode> articleContent = article.DocumentNode.Descendants().Where(x => !x.Name.Equals("aside")).ToList();

A jeżeli chcesz faktycznie usuwać z listy to łap to:

foreach (var item in asideRemove)
{
     resultat.DocumentNode.SelectSingleNode(item.XPath).Remove();
}
0

Dzięki, działa. Pomogła ta ostatnia instrukcja co usuwa wskaźnik. Gdyby ktoś czasem kiedyś potrzebował to ostateczna wersja wygląda tak:

HttpClient http = new HttpClient();
            var response = await http.GetByteArrayAsync("http://www.tvn24.pl/wiadomosci-ze-swiata,2/pierwsza-podroz-zagraniczna-trumpa,736985.html");
            String source = Encoding.GetEncoding("utf-8").GetString(response, 0, response.Length - 1);
            source = WebUtility.HtmlDecode(source);
            HtmlDocument result = new HtmlDocument();
            result.LoadHtml(source);

            List<HtmlNode> articleMarker = result.DocumentNode.Descendants().Where
                (x => (x.Name == "article")).ToList();
            List<HtmlNode> asideRemoves = new List<HtmlNode>();

            foreach (var item in articleMarker)
            {
                var asideRemove = item.Descendants("aside").ToList();
                foreach (var item1 in asideRemove)
                {
                    if (asideRemove != null)
                    {
                        asideRemoves.Add(item1);
                    }
                }
            }
            foreach (var item in asideRemoves)
            {
                result.DocumentNode.SelectSingleNode(item.XPath).Remove();
            }
            // zapisuje do zmiennej articleText czysty text bez znacznika <aside>
            var articleText = result.DocumentNode.Descendants().Where
                (x => (x.Name == "article")).FirstOrDefault().InnerText;

1 użytkowników online, w tym zalogowanych: 0, gości: 1