Obtenir InnerText en ignorant le noeud de script à l'aide de HTML Agility Pack en C #

c# html-agility-pack html-parsing

Question

J'ai la page suivante à partir de laquelle je veux obtenir une liste de serveurs proxy à partir d'une table:

http://proxy-list.org/spanish/search.php?search=&country=any&type=any&port=any&ssl=any

Chaque ligne du tableau est un élément ul. Mon problème est lors de l'obtention du premier élément li auquel la classe associée est "proxy" à partir de l'élément ul. Je souhaite obtenir l'adresse IP et le port afin d'exécuter un InnerText, mais comme l'élément li a un nœud enfant de script, il retourne le texte du nœud de script.

Ci-dessous une image de la structure de la page:

entrez la description de l'image ici

J'ai essayé ci-dessous le code en utilisant Html Agility Pack et LINQ:

WebClient webClient = new WebClient();
string page = webClient.DownloadString("http://proxy-list.org/spanish/search.php?search=&country=any&type=any&port=any&ssl=any");

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(page);

List<List<string>> table = doc.DocumentNode.SelectSingleNode("//div[@class='table']")
            .Descendants("ul")
            .Where(ul => ul.Elements("li").Count() > 1)
            .Select(ul => ul.Elements("li").Select(li =>
                {
                    string result = string.Empty;
                    if (li.HasClass("proxy"))
                    {
                        HtmlNode liTmp = li.Clone();
                        liTmp.RemoveAllChildren();
                        result = liTmp.InnerText.Trim();
                    }
                    else
                    {
                        result = li.InnerText.Trim();
                    }
                    return result;
                }).ToList()).ToList();

Je peux obtenir une liste dont chaque élément est une liste contenant les champs (Proxy, PaÃs, Tipo, Velocidad, HTTPS / SSL) mais le champ proxy est toujours vide. De plus, je ne reçois pas du tout les colonnes "País" et "Ciudad".

Réponse acceptée

En effet, ces valeurs sont injectées dans le DOM par JavaScript après le chargement de la page. En réalité, la valeur dans Proxy() est une représentation Base64 de ce que vous recherchez.

Dans l'image que vous avez publiée au-dessus de la valeur, MTQ4LjI0My4zNy4xMDE6NTMyODE= 148.243.37.101:53281 en 148.243.37.101:53281

La chaîne brute analysée que vous alimentez le pack Agility contient uniquement le champ Proxy ...

    <div class=\ "table-wrap\">\r\n
        <div class=\ "table\">\r\n
            <ul>\r\n
                <li class=\ "proxy\">
                    <script type=\ "text/javascript\">
                        Proxy('MTM4Ljk3LjkyLjI0OTo1MzgxNg==')
                    </script>
                </li>\r\n
                <li class=\ "https\">HTTP</li>\r\n
                <li class=\ "speed\">29.5kbit</li>\r\n
                <li class=\ "type\">
                    <strong>Elite</strong>
                </li>\r\n
                <li class=\ "country-city\">\r\n
                    <div>\r\n
                        <span class=\ "country\" title=\ "Brazil\">
                            <span class=\ "country-code\">
                                <span class=\ "flag br\"></span>
                                <span class=\ "name\">BR Brasil</span>
                            </span>
                        </span>
                        <!--\r\n                     -->
                        <span class=\ "city\">
                            <span>Rondon</span>
                        </span>\r\n </div>\r\n </li>\r\n </ul>\r\n
            <div class=\ "clear\"></div>\r\n

En utilisant le code suivant:

    <div class=\ "table-wrap\">\r\n
        <div class=\ "table\">\r\n
            <ul>\r\n
                <li class=\ "proxy\">
                    <script type=\ "text/javascript\">
                        Proxy('MTM4Ljk3LjkyLjI0OTo1MzgxNg==')
                    </script>
                </li>\r\n
                <li class=\ "https\">HTTP</li>\r\n
                <li class=\ "speed\">29.5kbit</li>\r\n
                <li class=\ "type\">
                    <strong>Elite</strong>
                </li>\r\n
                <li class=\ "country-city\">\r\n
                    <div>\r\n
                        <span class=\ "country\" title=\ "Brazil\">
                            <span class=\ "country-code\">
                                <span class=\ "flag br\"></span>
                                <span class=\ "name\">BR Brasil</span>
                            </span>
                        </span>
                        <!--\r\n                     -->
                        <span class=\ "city\">
                            <span>Rondon</span>
                        </span>\r\n </div>\r\n </li>\r\n </ul>\r\n
            <div class=\ "clear\"></div>\r\n

Je reçois: entrez la description de l'image ici




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi