1、需求:爬取http://caijing.bandao.cn/list.asp?cate=YW&page=1财经要闻栏目下的新闻标题、url、时间。
2、实现
Jsoup.connect("http://caijing.bandao.cn/list.asp?cate=YW&page=1") .timeout(5000) .get() .getElementsByClass("centerAllList") .fold(ArrayList<Map<String,String>>()){ acc, elements -> elements.getElementsByTag("li") .mapTo(acc){ mapOf( "text" to it.getElementsByTag("a").html(), "href" to it.getElementsByTag("a").attr("href"), "date" to it.getElementsByClass("date").html() ) } }.forEach(::println)
3、分析
1)首先获取页面上的centerAllList类,新闻数据都在这里面
2)在centerAllList类下,一对li标签代表一条新闻信息
3)我们看到,acc和elements参数被传进函数中,其中acc表示最后要返回的那个总的List;而elements表示centerAllList的List。我们把此List遍历,每一个子元素都代表一个centerAllList。接着我们获取centerAllList下所有的li,这样我们就能得到由li组成的List。
4)现在我们已经获取到所有的li了,接下来我们把li转为Map,一个Map代表一条新闻,所以我们最后需要的对象是由Map组成的List。其中acc代表最后要返回的List,而it代表每一个li。我们用mapTo把li转为Map,并将其存入到acc中,此时我们就得到了由Map组成的List了。