public static ExHentaiArticle GetArticleData(string source)
        {
            ExHentaiArticle article = new ExHentaiArticle();

            HtmlDocument document = new HtmlDocument();

            document.LoadHtml(source);
            HtmlNode nodes = document.DocumentNode.SelectNodes("//div[@class='gm']")[0];

            article.Thumbnail = Regex.Match(nodes.SelectSingleNode(".//div[@id='gleft']//div//div").GetAttributeValue("style", ""), @"https://exhentai.org/.*?(?=\))").Groups[0].Value;

            article.Title    = nodes.SelectSingleNode(".//div[@id='gd2']//h1[@id='gn']").InnerText;
            article.SubTitle = nodes.SelectSingleNode(".//div[@id='gd2']//h1[@id='gj']").InnerText;

            article.Type     = nodes.SelectSingleNode(".//div[@id='gmid']//div//div[@id='gdc']//a//img").GetAttributeValue("alt", "");
            article.Uploader = nodes.SelectSingleNode(".//div[@id='gmid']//div//div[@id='gdn']//a").InnerText;

            HtmlNodeCollection nodes_static = nodes.SelectNodes(".//div[@id='gmid']//div//div[@id='gdd']//table//tr");

            article.Posted   = nodes_static[0].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Parent   = nodes_static[1].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Visible  = nodes_static[2].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Language = nodes_static[3].SelectSingleNode(".//td[@class='gdt2']").InnerText.Split(' ')[0].ToLower();
            article.FileSize = nodes_static[4].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            int.TryParse(nodes_static[5].SelectSingleNode(".//td[@class='gdt2']").InnerText.Split(' ')[0], out article.Length);
            int.TryParse(nodes_static[6].SelectSingleNode(".//td[@class='gdt2']").InnerText.Split(' ')[0], out article.Favorited);

            HtmlNodeCollection nodes_data = nodes.SelectNodes(".//div[@id='gmid']//div[@id='gd4']//table//tr");

            Dictionary <string, string[]> information = new Dictionary <string, string[]>();

            foreach (var i in nodes_data)
            {
                try
                {
                    information.Add(i.SelectNodes(".//td")[0].InnerText.Trim(),
                                    i.SelectNodes(".//td")[1].SelectNodes(".//div").Select(e => e.SelectSingleNode(".//a").InnerText).ToArray());
                } catch { }
            }

            if (information.ContainsKey("language:"))
            {
                article.language = information["language:"];
            }
            if (information.ContainsKey("group:"))
            {
                article.group = information["group:"];
            }
            if (information.ContainsKey("parody:"))
            {
                article.parody = information["parody:"];
            }
            if (information.ContainsKey("character:"))
            {
                article.character = information["character:"];
            }
            if (information.ContainsKey("artist:"))
            {
                article.artist = information["artist:"];
            }
            if (information.ContainsKey("male:"))
            {
                article.male = information["male:"];
            }
            if (information.ContainsKey("female:"))
            {
                article.female = information["female:"];
            }
            if (information.ContainsKey("misc:"))
            {
                article.misc = information["misc:"];
            }

            HtmlNode           nodesc      = document.DocumentNode.SelectNodes("//div[@id='cdiv']")[0];
            HtmlNodeCollection nodes_datac = nodesc.SelectNodes(".//div[@class='c1']");
            List <Tuple <DateTime, string, string> > comments = new List <Tuple <DateTime, string, string> >();

            foreach (var i in nodes_datac ?? Enumerable.Empty <HtmlNode>())
            {
                try
                {
                    string date     = HttpUtility.HtmlDecode(i.SelectNodes(".//div[@class='c2']//div[@class='c3']")[0].InnerText.Trim());
                    string author   = HttpUtility.HtmlDecode(i.SelectNodes(".//div[@class='c2']//div[@class='c3']//a")[0].InnerText.Trim());
                    string contents = Regex.Replace(HttpUtility.HtmlDecode(i.SelectNodes(".//div[@class='c6']")[0].InnerHtml.Trim()), @"<br>", "\n");
                    comments.Add(new Tuple <DateTime, string, string> (
                                     DateTime.Parse(date.Remove(date.IndexOf(" UTC")).Substring("Posted on ".Length) + "Z"),
                                     author,
                                     contents));
                }
                catch { }
            }

            article.comment = comments.ToArray();

            return(article);
        }
        public static ExHentaiArticle GetArticleData(string source)
        {
            ExHentaiArticle article = new ExHentaiArticle();

            HtmlDocument document = new HtmlDocument();

            document.LoadHtml(source);
            HtmlNode nodes = document.DocumentNode.SelectNodes("//div[@class='gm']")[0];

            article.Thumbnail = Regex.Match(nodes.SelectSingleNode(".//div[@id='gleft']//div//div").GetAttributeValue("style", ""), @"https://exhentai.org/.*?(?=\))").Groups[0].Value;

            article.Title    = nodes.SelectSingleNode(".//div[@id='gd2']//h1[@id='gn']").InnerText;
            article.SubTitle = nodes.SelectSingleNode(".//div[@id='gd2']//h1[@id='gj']").InnerText;

            article.Type     = nodes.SelectSingleNode(".//div[@id='gmid']//div//div[@id='gdc']//a//img").GetAttributeValue("alt", "");
            article.Uploader = nodes.SelectSingleNode(".//div[@id='gmid']//div//div[@id='gdn']//a").InnerText;

            HtmlNodeCollection nodes_static = nodes.SelectNodes(".//div[@id='gmid']//div//div[@id='gdd']//table//tr");

            article.Posted    = nodes_static[0].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Parent    = nodes_static[1].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Visible   = nodes_static[2].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Language  = nodes_static[3].SelectSingleNode(".//td[@class='gdt2']").InnerText.Split(' ')[0].ToLower();
            article.FileSize  = nodes_static[4].SelectSingleNode(".//td[@class='gdt2']").InnerText;
            article.Length    = int.Parse(nodes_static[5].SelectSingleNode(".//td[@class='gdt2']").InnerText.Split(' ')[0]);
            article.Favorited = int.Parse(nodes_static[6].SelectSingleNode(".//td[@class='gdt2']").InnerText.Split(' ')[0]);

            HtmlNodeCollection nodes_data = nodes.SelectNodes(".//div[@id='gmid']//div[@id='gd4']//table//tr");

            Dictionary <string, string[]> information = new Dictionary <string, string[]>();

            foreach (var i in nodes_data)
            {
                try
                {
                    information.Add(i.SelectNodes(".//td")[0].InnerText.Trim(),
                                    i.SelectNodes(".//td")[1].SelectNodes(".//div").Select(e => e.SelectSingleNode(".//a").InnerText).ToArray());
                } catch { }
            }

            if (information.ContainsKey("language:"))
            {
                article.language = information["language:"];
            }
            if (information.ContainsKey("group:"))
            {
                article.group = information["group:"];
            }
            if (information.ContainsKey("parody:"))
            {
                article.parody = information["parody:"];
            }
            if (information.ContainsKey("character:"))
            {
                article.character = information["character:"];
            }
            if (information.ContainsKey("artist:"))
            {
                article.artist = information["artist:"];
            }
            if (information.ContainsKey("male:"))
            {
                article.male = information["male:"];
            }
            if (information.ContainsKey("female:"))
            {
                article.female = information["female:"];
            }
            if (information.ContainsKey("misc:"))
            {
                article.misc = information["misc:"];
            }

            return(article);
        }