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); }
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 }); }
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; } } }
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); }