• [译] 第十八天:BoilerPipe


    前言

    今天的30天挑战,我决定学习用Java处理从web链接提取文字和图片的问题,这在网站挖掘内容中非常常见,类似Prismatic. 本文,我们来学习用boilerpipeJava库来完成这个任务。 

    前提准备

    1. 掌握Java基础知识。安装最新的Java Development      Kit(JDK), 可以安装OpenJDK 7或者Oracle JDK 7, OpenShift支持OpenJDK 6 7.
    2. OpenShift上注册。OpenShift完全免费,红帽给每个用户免费提供了3Gears来运行程序。目前,这个资源分配合计有每人1.5GB内存,3GB磁盘空间。
    3. 在本机安装rhc 客户端工具,rhcruby gem包,所以你需要安装1.8.7或以上版本的ruby。安装rhc,输入 sudo gem install  rhc. 如果已经安装了,确保是最新的,要更新rhc,输入sudo gem update  rhc.  想了解rhc command-line 工具,更多帮助参考https://www.openshift.com/developers/rhc-client-tools-install.
    4. rhc setup 命令安装OpenShift. 执行命令可以帮你创建空间,上传ssh 密钥到OpenShift服务器。 

    第一步:创建Jboss EAP程序

    开始创建demo, 命名newsapp.

    $ rhc create-app newsapp jbosseap

     

    如果你能访问普通gears可以用以下命令:

    $ rhc create-app newsapp jbosseap -g medium

     

    这会创建一个叫gear的程序容器,安装所需的SELinux策略和cgroup配置,OpenShift也会为你安装一个私有git仓库,克隆到本地,然后它会把DNS传播到网络。可访问http://newsapp-{domain-name}查看程序。替换你自己唯一的OpenShift域名(有时也叫命名空间)

    第二步:添加Maven依赖

    pom.xml中添加依赖。

    <dependency>
        <groupId>de.l3s.boilerpipe</groupId>
        <artifactId>boilerpipe</artifactId>
        <version>1.2.0</version>
    </dependency>
    <dependency>
        <groupId>xerces</groupId>
        <artifactId>xercesImpl</artifactId>
        <version>2.9.1</version>
    </dependency>
     
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.13</version>
    </dependency>
    View Code

     

    你也需要新加个仓库。

    <repository>
        <id>boilerpipe-m2-repo</id>
        <url>http://boilerpipe.googlecode.com/svn/repo/</url>
        <releases>
            <enabled>true</enabled>
        </releases>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    View Code

     

    更新pom.xml里几个属性把maven项目更新到Java 7.

    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
    View Code

     

    现在更新Maven项目, 右击>Maven>Update Project.

    第四步:创建BoilerpipeContentExtractionService

    创建BoilerpipeContentExtractionService服务,用来获得url,找文章标题和内容。

    import java.net.URL;
    import java.util.Collections;
    import java.util.List;
     
    import com.newsapp.boilerpipe.image.Image;
    import com.newsapp.boilerpipe.image.ImageExtractor;
     
    import de.l3s.boilerpipe.BoilerpipeExtractor;
    import de.l3s.boilerpipe.document.TextDocument;
    import de.l3s.boilerpipe.extractors.ArticleExtractor;
    import de.l3s.boilerpipe.extractors.CommonExtractors;
    import de.l3s.boilerpipe.sax.BoilerpipeSAXInput;
    import de.l3s.boilerpipe.sax.HTMLDocument;
    import de.l3s.boilerpipe.sax.HTMLFetcher;
     
    public class BoilerpipeContentExtractionService {
     
        public Content content(String url) {
            try {
                final HTMLDocument htmlDoc = HTMLFetcher.fetch(new URL(url));
                final TextDocument doc = new BoilerpipeSAXInput(htmlDoc.toInputSource()).getTextDocument();
                String title = doc.getTitle();
     
                String content = ArticleExtractor.INSTANCE.getText(doc);
     
                final BoilerpipeExtractor extractor = CommonExtractors.KEEP_EVERYTHING_EXTRACTOR;
                final ImageExtractor ie = ImageExtractor.INSTANCE;
     
                List<Image> images = ie.process(new URL(url), extractor);
     
                Collections.sort(images);
                String image = null;
                if (!images.isEmpty()) {
                    image = images.get(0).getSrc();
                }
     
                return new Content(title, content.substring(0, 200), image);
            } catch (Exception e) {
                return null;
            }
     
        }
    }
    View Code

     

    以上代码:

    1. 从给定的url获取文件。
    2. 分析HTML, 返回TextDocument
    3. 从文章内容获取标题。
    4. 最后,从文章提取内容,返回程序值对象的新实例。 

    第五步:激活JAX-RS

    要激活JAX-RS, 创建一个类继承 javax.ws.rs.core.Application, 指定路径用 javax.ws.rs.ApplicationPath

    import javax.ws.rs.ApplicationPath;
    import javax.ws.rs.core.Application;
     
    @ApplicationPath("/api/v1")
    public class JaxrsInitializer extends Application{
     
     
    }
    View Code

    第六步:创建ContentExtractionResource

    现在创建ContentExtractionResource类,让内容最为JSON返回,新建类ContentExtractionResource, 用以下代码替代。

    import javax.inject.Inject;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.QueryParam;
    import javax.ws.rs.core.MediaType;
     
    import com.newsapp.service.BoilerpipeContentExtractionService;
    import com.newsapp.service.Content;
     
    @Path("/content")
    public class ContentExtractionResource {
     
        @Inject
        private BoilerpipeContentExtractionService boilerpipeContentExtractionService;
     
        @GET
        @Produces(value = MediaType.APPLICATION_JSON)
        public Content extractContent(@QueryParam("url") String url) {
            return boilerpipeContentExtractionService.content(url);
        }
    }
    View Code

    部署到OpenShift

    最后,部署更新到OpenShift.

    $ git add .
    $ git commit -am "NewApp"
    $ git push
    View Code

     

    代码和war成功推送部署后,可以在http://newsapp-{domain-name}.rhcloud.com查看程序,我的示例http://newsapp-t20.rhcloud.com. 

     

    现在可以在程序界面提交一个链接测试。

    这就是今天的内容,继续给反馈吧。

     

    原文:https://www.openshift.com/blogs/day-18-boilerpipe-article-extraction-for-java-developers

  • 相关阅读:
    Java Object part1
    StringBuffer StringBuilder append
    Java equal
    java Classloader
    Java NIO
    Oracle中Blob和Clob
    Java8 Lambda 表达式
    HashMap分析 + 哈希表
    android自定义控件之滚动广告条
    android自定义控件之模仿优酷菜单
  • 原文地址:https://www.cnblogs.com/endless-on/p/3503996.html
Copyright © 2020-2023  润新知