Exemplo n.º 1
0
        private int parseReadPage(BookDataDetailed book, HtmlDocument document)
        {
            var readerlists = document.GetElementbyId("readerlists");
            var page        = readerlists.SelectNodes("./div[@class='pages']/*")?.Count ?? 1;
            var chps        = readerlists.SelectNodes("./ul/li").EmptyIfNull();

            foreach (var item in chps)
            {
                var href = item.Element("a")?.GetAttribute("href", null);
                if (href.IsNullOrWhiteSpace())
                {
                    var content = item.GetInnerText();
                    var ep      = content.LastIndexOf(' ');
                    if (ep > 0)
                    {
                        content = content.Substring(0, ep);
                    }
                    book.Chapters.Add(new ChapterDataBrief
                    {
                        Key   = "n" + book.Chapters.Last().Key,
                        Title = content,
                    });
                }
                else
                {
                    var content = item.Element("a").GetInnerText();
                    book.Chapters.Add(new ChapterDataBrief
                    {
                        Key   = idReg.Match(href).Groups[1].Value,
                        Title = content,
                    });
                }
            }
            return(page);
        }
Exemplo n.º 2
0
        protected override async Task <GetBookResponse> GetBookAsync(GetBookRequest request)
        {
            var d        = new BookDataDetailed();
            var readPage = await GetDoc(new Uri($"/xiaoshuo/{request.BookKey}/", UriKind.Relative));

            parseBookMeta(d, readPage);
            parseReadPage(d, readPage);
            var bookPage = await GetDoc(new Uri($"/{request.BookKey.Split('/')[1]}/", UriKind.Relative));

            parseBookPage(d, bookPage);
            return(new GetBookResponse {
                BookData = d
            });
        }
Exemplo n.º 3
0
        private void parseReadPage(BookDataDetailed book, HtmlDocument document)
        {
            var readerlists = document.DocumentNode.SelectSingleNode("./html/body/dl[@class='book']");
            var currentVol  = "";
            var inChps      = false;

            foreach (var item in readerlists.ChildNodes)
            {
                switch (item.Name)
                {
                case "dt":
                    var vol = item.GetInnerText().Trim();
                    if (inChps)
                    {
                        if (vol.StartsWith(book.Title))
                        {
                            vol = vol.Substring(book.Title.Length).Trim();
                        }
                        currentVol = vol;
                    }
                    else
                    {
                        if (vol.EndsWith("全文阅读"))
                        {
                            inChps = true;
                        }
                    }
                    break;

                case "dd":
                    if (!inChps)
                    {
                        continue;
                    }
                    var href    = item.Element("a")?.GetAttribute("href", null);
                    var content = item.Element("a").GetInnerText();
                    book.Chapters.Add(new ChapterDataBrief
                    {
                        Key         = chpIdReg.Match(href).Groups[2].Value + " " + currentVol,
                        Title       = content,
                        VolumeTitle = currentVol,
                    });
                    break;

                default:
                    continue;
                }
            }
        }
Exemplo n.º 4
0
        protected override async Task <SearchResponse> SearchAsync(SearchRequest request)
        {
            var sb = new StringBuilder("https://www.2kxs.com/modules/article/search.php?searchtype=keywords&searchkey=");

            foreach (var item in GBEncoding.GetBytes(request.Keyword))
            {
                sb.Append('%');
                sb.Append(item.ToString("X2"));
            }
            var uri = new Uri(sb.ToString());
            var doc = await GetDoc(uri);

            var r       = new SearchResponse();
            var content = doc.GetElementbyId("content");

            if (content is null)
            {
                var bf = new BookDataDetailed();
                parseBookPage(bf, doc);
                var readPage = await GetDoc(new Uri($"/xiaoshuo/{bf.Key}/", UriKind.Relative));

                parseBookMeta(bf, readPage);
                parseReadPage(bf, readPage);
                r.Books.Add(bf);
            }
            else
            {
                foreach (var item in content.SelectNodes("table/tr[position()>1]"))
                {
                    var title     = item.SelectSingleNode("./td[1]/a");
                    var latestChp = item.SelectSingleNode("./td[2]/a");
                    var author    = item.SelectSingleNode("./td[3]");
                    var wordCount = item.SelectSingleNode("./td[4]").GetInnerText();
                    var wc        = int.Parse(wordCount.Substring(0, wordCount.Length - 1));
                    if (char.IsDigit(wordCount.Last()))
                    {
                        wc *= 10;
                    }
                    else if (char.ToLowerInvariant(wordCount.Last()) == 'k')
                    {
                        wc *= 1000;
                    }
                    else if (char.ToLowerInvariant(wordCount.Last()) == 'm')
                    {
                        wc *= 1000_000;
                    }
                    var lastUpdate = item.SelectSingleNode("./td[5]").GetInnerText();
                    var status     = item.SelectSingleNode("./td[6]").GetInnerText();

                    var key = latestChp.GetAttributeValue("href", "");
                    key = bookIdReg.Match(key).Groups[2].Value;

                    r.Books.Add(new BookDataBrief
                    {
                        Title         = title.GetInnerText(),
                        Author        = author.GetInnerText(),
                        Key           = key,
                        WordCount     = wc,
                        IsFinished    = status == "完成",
                        LatestChapter = new ChapterDataBrief
                        {
                            Key        = "Latest",
                            UpdateTime = DateTime.Parse(lastUpdate),
                            Title      = latestChp.GetInnerText(),
                        }
                    });
                }
            }
            return(r);
        }