jsoup解析html/根据关键词拿到论坛帖子信息

以论坛《宽带山》为例,需要根据给定的关键词,取得关于该关键词的所有帖子,包括人气数,发帖主题,回复数,发表人,发表时间,帖子链接,帖子详细文本内容等。

详细代码如下:

Java代码
  1. importjava.util.ArrayList;
  2. importjava.util.HashMap;
  3. importjava.util.List;
  4. importjava.util.Map;
  5. importorg.jsoup.Jsoup;
  6. importorg.jsoup.nodes.Document;
  7. importorg.jsoup.nodes.Element;
  8. importorg.jsoup.select.Elements;
  9. publicclassKeyWordsSearchUtil{
  10. /**
  11. *根据关键词查询论坛所需信息map
  12. *@paramKeyWord传入关键词
  13. *@return
  14. */
  15. publicstaticList<Map<String,Object>>findByKeyWord(StringKeyWord){
  16. List<Map<String,Object>>postsList=newArrayList<Map<String,Object>>();
  17. Map<String,Object>postsOneMap=null;
  18. try{
  19. Documentdoc=Jsoup.connect("http://club.pchome.net/forum_1_15____md__1_"+java.net.URLEncoder.encode(KeyWord,"utf-8")+".html")
  20. .data("query","Java")
  21. .userAgent("Mozilla")
  22. .cookie("auth","token")
  23. .timeout(10000)
  24. .ignoreHttpErrors(true)
  25. .post();
  26. ElementspostsLs=doc.select("li.i2").not(".h-bg");
  27. if(postsLs!=null&&postsLs.size()>0){
  28. for(ElementchildPost:postsLs){
  29. postsOneMap=newHashMap<String,Object>();
  30. postsOneMap.put("postsPopularity",childPost.select("li>span.n2").first().text());
  31. postsOneMap.put("postsTitle",childPost.select("span.n3>a").attr("title"));
  32. postsOneMap.put("postsFloor",childPost.select("span.n4").first().text());
  33. postsOneMap.put("postsCname",childPost.select("a.bind_hover_card").first().text());
  34. postsOneMap.put("postsCtime",childPost.select("li>span.n6").first().text());
  35. postsOneMap.put("postsUrl","http://club.pchome.net"+childPost.select("span.n3a").attr("href"));
  36. postsOneMap.put("postsContents",getContentsByUrl("http://club.pchome.net"+childPost.select("span.n3a").attr("href")));
  37. postsList.add(postsOneMap);
  38. }
  39. }
  40. }catch(Exceptione){
  41. e.printStackTrace();
  42. }
  43. returnpostsList;
  44. }
  45. /**
  46. *根据帖子的url获取帖子的文本内容
  47. *@paramurl帖子的路径
  48. *@return
  49. */
  50. publicstaticStringgetContentsByUrl(Stringurl){
  51. Stringcontents="11";
  52. try{
  53. Documentdoc=Jsoup.connect(url)
  54. .data("query","Java")
  55. .userAgent("Mozilla")
  56. .cookie("auth","token")
  57. .timeout(10000)
  58. .ignoreHttpErrors(true)
  59. .post();
  60. if(doc.select("div.mc").first()!=null){
  61. ElementcontentsEle=doc.select("div.mcdiv").first();
  62. contents=contentsEle.select("div").first().text();
  63. if(contents.contains("[向左转][向右转][原图]")){
  64. contents=contents.replace("[向左转][向右转][原图]","");
  65. }
  66. }
  67. }catch(Exceptione){
  68. e.printStackTrace();
  69. }
  70. returncontents;
  71. }
  72. publicstaticvoidmain(String[]args)throwsException{
  73. List<Map<String,Object>>postsList=KeyWordsSearchUtil.findByKeyWord("电影");
  74. System.out.println("http://club.pchome.net/forum_1_15____md__1_"+java.net.URLEncoder.encode("电影","utf-8")+".html");
  75. System.out.println(postsList.size()+"/////");
  76. for(inti=0;i<postsList.size();i++){
  77. for(Map.Entry<String,Object>entry:postsList.get(i).entrySet()){
  78. System.out.println("key="+entry.getKey()+"|value="+entry.getValue());
  79. }
  80. System.out.println("-----------------");
  81. }
  82. //http://club.pchome.net/thread_1_15_7519679.html
  83. //Stringstr=getContentsByUrl("http://club.pchome.net/thread_1_15_7519679.html");
  84. //System.out.println(str);
  85. }
  86. }

以上代码能成功抓取宽带山论坛中,关键词为:电影 的相关帖子列表,main方法中已有测试,网络畅通下可测试通过。但上面代码仅为完成功能,性能较差,项目中需重写或优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值