Esempio n. 1
0
  @Override
  public void execute() {

    try {
      // 根据URL地址,获取网页内容
      String html = HttpUtils.getHtml(httpclient, url);

      if (html == null) {
        throw new RuntimeException("无法获取【" + url + "】网址的内容");
      }

      Topic a = new Topic();

      // 设置文章的来源
      a.setSource("www.ibm.com");

      // 对网页内容进行分析和提取
      // 设置文章的标题
      MetaTag titleTag = ParseUtils.parseTag(html, MetaTag.class, "name", "title");
      a.setTitle(titleTag.getMetaContent());

      // 设置文章的关键字
      MetaTag keywordTag = ParseUtils.parseTag(html, MetaTag.class, "name", "Keywords");
      if (keywordTag.getMetaContent().length() > 255) {
        a.setKeyword(keywordTag.getMetaContent().substring(0, 255));
      }

      // 设置文章的简介
      MetaTag introTag = ParseUtils.parseTag(html, MetaTag.class, "name", "Abstract");
      a.setSummary(introTag.getMetaContent());

      // 设置文章的作者
      List<Div> authors = ParseUtils.parseTags(html, Div.class, "class", "author");
      String author = "";
      for (int i = 0; i < authors.size(); i++) {
        if (i != 0) {
          author = author + ",";
        }
        Div div = authors.get(i);
        author = author + ParseUtils.parseTag(div.getStringText(), LinkTag.class).getStringText();
      }
      a.setAuthor(author);

      // 设置文章的内容
      String content =
          StringUtils.substringBetween(html, "<!-- MAIN_COLUMN_CONTENT_BEGIN -->", "<!-- CMA");

      // 查询文章的内容中所包含的图片,并下载到upload目录,然后创建Attachment对象,设置到Article对象中
      List<ImageTag> imageTags = ParseUtils.parseTags(content, ImageTag.class);
      if (imageTags != null) {
        for (ImageTag it : imageTags) {

          // 得到图片所在的路径目录
          String baseUrl = url.substring(0, url.lastIndexOf("/") + 1);

          // 这个是<img>标签中的src的值
          String imageUrl = it.getImageURL();

          // 图片的绝对路径
          String absoluteUrl = baseUrl + imageUrl;

          // :   "文章标题/xxx.jpg"
          String imageName =
              a.getTitle().replaceAll("/|\\\\|\\:|\\*|\\?|\\||\\<|>", "_") + "/" + imageUrl;

          // 把图片保存到upload目录
          // 首先确定,保存到本地的图片的路径
          String imageLocalFile = ""; // Attachment.ATTACHMENT_DIR + imageName;

          // 如果图片已经被下载到本地,则不再下载
          if (!new File(imageLocalFile).exists()) {
            // 下载图片的信息
            byte[] image = HttpUtils.getImage(httpclient, absoluteUrl);
            // 直接使用new FileOutputStream(imageLocalFile)这种方式,创建一个
            // 文件输出流,存在的问题就是:如果这个文件所在的目录不存在,则创建不了
            // 输出流,会抛出异常!
            // 所以,使用辅助的工具类来创建一个文件输出流:FileUtils.openOutputStream(new File(imageLocalFile))
            // 通过这个方法,当文件所在的父目录不存在的时候,将自动创建其所有的父目录
            IOUtils.write(image, FileUtils.openOutputStream(new File(imageLocalFile)));
            System.out.println("图片【" + absoluteUrl + "】已下载");
          }

          // 针对每张图片,创建一个Attachment对象
          Attachment attachment = new Attachment();
          attachment.setType("image/jpeg");
          attachment.setOldName(imageName);
          // a.addAttachment(attachment);
        }
      }

      // 修改content中的所有图片的src的值
      // 将src的值,加上前缀:upload_image/文章标题/图片.jpg
      content =
          ParseUtils.modifyImageUrl(
              content,
              "upload_image/" + a.getTitle().replaceAll("/|\\\\|\\:|\\*|\\?|\\||\\<|>", "_") + "/");

      // 删除<hr>和"回首页"的链接标签
      content = ParseUtils.reomveTags(content, Div.class, "class", "ibm-alternate-rule");
      content =
          ParseUtils.reomveTags(
              content, ParagraphTag.class, "class", "ibm-ind-link ibm-back-to-top");

      a.setContent(content);

      // 将文章对象放入HttpContext
      List<Topic> articles = new ArrayList<Topic>();
      articles.add(a);

      context.setAttribute("articles", articles);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }