Kotlin协程中返回jsoup爬取列表异常,如何解决?
问题分析与解决方案
你的问题出在返回语句写法错误和函数返回类型不明确两个核心点上:
错误1:返回了Lambda表达式而非列表本身
你在withContext块内写的return@withContext { table },实际上是返回了一个无参Lambda(即Function0类型),而非你组装好的table列表。这就是为什么日志能输出完整数据,但调用时拿到的却是Function0对象的原因。
错误2:函数返回类型使用Any而非具体类型
用Any作为返回类型会丢失类型信息,既让调用方难以处理,也容易隐藏这类返回错误。
修正后的爬取函数代码
suspend fun popularHome( pg: String ): List<Map<String, String>> = withContext(Dispatchers.IO) { val table = mutableListOf<Map<String, String>>() val doc: Document = Jsoup .connect("https://www.novelupdates.com/novelslisting/?sort=2&order=1&status=1&pg=$pg") .userAgent("Mozilla/5.0") .referrer("http://www.google.com") .ignoreContentType(true) .get() val imageLists = doc.getElementsByClass("search_img_nu") val lists = doc.getElementsByClass("search_main_box_nu") for ((list, imageList) in lists.zip(imageLists)) { val searches: Elements = list.getElementsByClass("search_title") val imageSearches: Elements = imageList.getElementsByTag("img") for ((search, imageSearch) in searches.zip(imageSearches)) { val titles = search.getElementsByTag("a") val ranks = search.getElementsByClass("genre_rank") for ((title, rank) in titles.zip(ranks)) { val link: String = title.attr("href") val titleName: String = title.text() val imageLink: String = imageSearch.attr("src") val rankName: String = rank.text().replace("#", "") table.add( mapOf( // 推荐用不可变Map,避免外部意外修改 "rank" to rankName, "title" to titleName, "link" to link, "image" to imageLink ) ) } } } Log.i("tag", table.toString()) // 直接返回列表,无需添加大括号 return@withContext table }
关键修改说明
- 明确返回类型:将返回类型从
Any改为List<Map<String, String>>,让函数语义更清晰,避免类型歧义 - 修正返回语句:把
return@withContext { table }改成return@withContext table,直接返回组装好的列表对象 - 可选优化:用
mapOf替代mutableMapOf,返回不可变Map,防止后续逻辑意外修改爬取到的数据
调用代码无需调整
MainActivity中的调用逻辑保持原样即可,现在scrape.popularHome("1")会正确返回你需要的爬取结果列表,打印输出的不再是Function0对象。
内容的提问来源于stack exchange,提问作者Sofa44
相关产品推荐
相关产品推荐

