Day 18: BoilerPipe —— Java开发者的文章提取工具

简介: 今天我决定学习如何使用Java做网页链接的文本和图像提取。在大多数内容发现网站上(如Prismatic)这是一个非常常见的需求,今天就是学习如何使用一个名为boilerpipe的Java库来完成这个任务。

编者注:我们发现了有趣的系列文章《30天学习30种新技术》,正在翻译,一天一篇更新,年终礼包。下面是第 18 天的内容。


今天我决定学习如何使用Java做网页链接的文本和图像提取。在大多数内容发现网站上(如Prismatic)这是一个非常常见的需求,今天就是学习如何使用一个名为boilerpipe的Java库来完成这个任务。


准备

  1. 基本的Java知识是必需的,安装最新的Java开发工具包(JDK ),可以是OpenJDK 7Oracle JDK 7
  2. 注册一个OpenShift帐户,它是完全免费的,可以分配给每个用户1.5 GB的内存和3 GB的磁盘空间。
  3. 安装RHC客户端工具,需要有ruby 1.8.7或更新的版本,如果已经有ruby gem,输入 sudo gem install rhc ,确保它是最新版本。要更新RHC的话,执行命令 sudo gem update rhc,如需其他协助安装RHC命令行工具,请参阅该页面: https://www.openshift.com/developers/rhc-client-tools-install
  4. 通过 rhc setup 命令设置您的OpenShift帐户,此命令将帮助你创建一个命名空间,并上传你的SSH keys到OpenShift服务器。

第1步:创建一个JBoss EAP的应用

首先从创建示例应用程序开始,把该应用称作 newsapp

$ rhc create-app newsapp jbosseap

然后可以使用如下命令:

$ rhc create-app newsapp jbosseap -g medium

这样会创建一个应用程序容器,设置好所有需要的SELinux政策和cgroup配置,OpenShift也将创建一个私人git仓库并克隆到本地。最后,OpenShift会给外界提供一个DNS,该应用程序将在http://newsapp-{domain-name}.rhcloud.com/下可以访问(将 domain-name 更换为自己的域名)。

第2步:添加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>

同时也需要加一个新的库:

<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>

通过更新 pom.xml 文件里的几个特性将Maven项目更新到Java 7:

<maven.compiler.source>1.7</maven.compiler.source>

<maven.compiler.target>1.7</maven.compiler.target>

现在就可以更新Maven项目了(右键单击>Maven>更新项目)。


第3步:启用CDI

使用CDI来进行依赖注入。CDI、上下文和依赖注入是一个Java EE 6规范,能够使依赖注入在Java EE 6的项目中。

src/main/webapp/WEB-INF 文件夹下建一个名为beans.xml中一个新的XML文件。更换beans.xml中的以下内容:

<beansxmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">

</beans>


第4步:创建Boilerpipe内容提取服务

现在创建一个Boilerpipe内容提取服务的服务类,这个类会用一个url,从这个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;

       }

   }

}

上述代码执行以下操作:

  1. 首先在给定的url中读取文件
  2. 然后解析HTML文档并返回TextDocument
  3. 接下来从文本文件中提取标题
  4. 最后从文本中提取内容,返回一个应用的值对象的新实例(value object)


第5步:启用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{

}

第6步:创建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);

   }

}

部署到OpenShift

最后,更改部署到OpenShift

$ git add .

$ git commit -am "NewApp"

$ git push

在代码push和部署完成后,我们可以http://newsapp-{{domain-name}.rhcloud.com 查看正在运行的应用程序。我的示例应用程序展示如下。

image.png

今天就这些,欢迎反馈。

相关文章
|
7月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
981 4
|
8月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
3257 8
|
8月前
|
人工智能 缓存 监控
使用LangChain4j构建Java AI智能体:让大模型学会使用工具
AI智能体是大模型技术的重要演进方向,它使模型能够主动使用工具、与环境交互,以完成复杂任务。本文详细介绍如何在Java应用中,借助LangChain4j框架构建一个具备工具使用能力的AI智能体。我们将创建一个能够进行数学计算和实时信息查询的智能体,涵盖工具定义、智能体组装、记忆管理以及Spring Boot集成等关键步骤,并展示如何通过简单的对话界面与智能体交互。
3297 1
|
8月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
775 1
|
8月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
3076 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
8月前
|
缓存 Java 开发者
Java 开发者必看!ArrayList 和 LinkedList 的性能厮杀:选错一次,代码慢成蜗牛
本文深入解析了 Java 中 ArrayList 和 LinkedList 的性能差异,揭示了它们在不同操作下的表现。通过对比随机访问、插入、删除等操作的效率,指出 ArrayList 在多数场景下更高效,而 LinkedList 仅在特定情况下表现优异。文章强调选择合适容器对程序性能的重要性,并提供了实用的选择法则。
396 3
|
9月前
|
Java 测试技术 API
2025 年 Java 开发者必知的最新技术实操指南全览
本指南涵盖Java 21+核心实操,详解虚拟线程、Spring Boot 3.3+GraalVM、Jakarta EE 10+MicroProfile 6微服务开发,并提供现代Java开发最佳实践,助力开发者高效构建高性能应用。
1264 5
|
9月前
|
人工智能 自然语言处理 Java
面向 Java 开发者:2024 最新技术栈下 Java 与 AI/ML 融合的实操详尽指南
Java与AI/ML融合实践指南:2024技术栈实战 本文提供了Java与AI/ML融合的实操指南,基于2024年最新技术栈(Java 21、DJL 0.27.0、Spring Boot 3.2等)。主要内容包括: 环境配置:详细说明Java 21、Maven依赖和核心技术组件的安装步骤 图像分类服务:通过Spring Boot集成ResNet-50模型,实现REST接口图像分类功能 智能问答系统:展示基于RAG架构的文档处理与向量检索实现 性能优化:利用虚拟线程、GraalVM等新技术提升AI服务性能 文
871 0
|
11月前
|
Java 数据安全/隐私保护
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本项目提供了一套基于Java的图片处理教学方案,包含自定义图片生成、图像水印添加及合法电子凭证生成技术示例。
|
11月前
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。