在我们访问的每个网页上,我们都会遇到大量的多媒体内容,所有这些内容都是用超文本标记语言(Hyper Text Markup Language, HTML)放在一起展示的。HTML是许多开发人员都熟悉的一种基本编程语言,它由各种元素组成——当被浏览器解释时——通常由各种自定义元素组成连贯、有组织和有意的显示。这段代码提供了一个框架,用于我们如何查看图像、视频、正文、超链接、数据输入字段以及在网页上你能想到的任何其他内容-任何人都可以通过在任何浏览器上单击右键来查看所有这些代码。
考虑到任何复杂的HTML字符串中都存在大量的格式化元素,代码的实际主题(隐藏在这些字符串中的文本内容和文件路径)可能有点难以独立于这些格式化规范访问。例如,如果我们想查看网页副本,然后以有意义的方式编辑或操作该文本,我们将很难直接从显示的网页复制和粘贴该信息。我们最终只会得到一堆格式不一致的文本,充斥着超链接、徽标、脱节的制表符和空格等。这并不是说这是不可能的。当然,我们可以从任何网页中复制小的文本片段,并在Microsoft Word等富文本编辑器中重新设置这些文本片段的格式,使其类似于原始格式。问题是这种“点击和点击”的方法消耗了我们工作中的宝贵时间,如果我们需要扩展我们的操作来包含多个网站和数千字符的文本,尝试手动操作从长远来看将对我们自己造成很大的伤害。
与其浪费宝贵的时间和精力试图通过灵巧的点击和拖动来获取我们想要的文本,还不如使用专门用于这样做的API服务完全从HTML代码中删除它。我们可以通过一些方法来实现这种分离,这些方法虽然表面上看起来相同,但可以适应稍微不同的用例。这些方法包括:
- 将HTML文件转换为纯文本
- 将HTML字符串转换为纯文本
- 从文本字符串中删除HTML
第一种方法和第二种方法本质上是相同的操作,只不过有两种不同的场景:在前者中,HTML代码以文件形式提供给我们(当我们点击它时,它会直接作为浏览器页面打开);在后者中,我们可以以文本字符串的形式提供给我们(例如,我们通过在web浏览器中右键单击复制的HTML)。第三种方法在技术上与前两种方法实现了相同的目标,它设想了一个更安全的用例,帮助我们在给定的文本字符串中识别HTML和跨站脚本攻击(一种恶意参与者将可执行脚本放入可信应用程序/网站代码的网络威胁形式),而无需假设我们有一个完整的HTML字符串来处理。
在本文的其余部分,我将演示三种简单的API解决方案,它们可用于将HTML代码与纯文本内容分离,适用于上面列出的三种略有不同的场景。这些API都是免费使用的,可以通过Cloudmersive Document Conversion API端点(Cloudmersive Document Conversion API endpoint)使用一个免费层的Cloudmersive API密钥对每个服务进行身份验证(每月限制800次API调用,没有额外的承诺)。下面,我提供了准备运行的Java代码示例,以帮助您构建对这三个API的API调用,并在需要输入请求和输出响应时提供了额外的说明。
在我们开始调用每个API迭代之前,我首先会提供一些说明,帮助你使用Maven或Gradle安装API客户端(这些说明在每次API迭代中都是一样的)。要用Maven安装,第一个任务是在pom.xml中添加对仓库的引用:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
之后,我们只需要添加一个额外的pom.xml依赖:
<dependencies>
<dependency>
<groupId>com.github.Cloudmersive</groupId>
<artifactId>Cloudmersive.APIClient.Java</artifactId>
<version>v4.25</version>
</dependency>
</dependencies>
要用Gradle来安装,我们需要将下面的代码片段添加到根版本中。build.gradle(在仓库的末尾):
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
之后,我们需要在build.gradle中添加以下依赖:
dependencies {
implementation 'com.github.Cloudmersive:Cloudmersive.APIClient.Java:v4.25'
}
安装完成后,我们可以继续构建我们的API调用。我将演示的第一个API迭代可用于将HTML文档(文件)转换为纯文本。这个API需要在inputFile字段中包含一个文件路径输入(由下面示例中的代码注释表示)。我们只需要将以下代码复制到我们的文件中,并相应地配置我们的输入:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ConvertDocumentApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
//Apikey.setApiKeyPrefix("Token");
ConvertDocumentApi apiInstance = new ConvertDocumentApi();
File inputFile = new File("/path/to/inputfile"); // File | Input file to perform the operation on.
try {
TextConversionResult result = apiInstance.convertDocumentHtmlToTxt(inputFile);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling ConvertDocumentApi#convertDocumentHtmlToTxt");
e.printStackTrace();
}
我将演示的第二个API迭代可以用于将HTML字符串转换为文本。这个API的请求参数需要一个简单的HTML字符串输入,格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<HtmlToTextRequest>
<Html>string</Html>
</HtmlToTextRequest>
有了正确格式化的HTML字符串,你可以通过下面的代码示例传递你的字符串,并且你已经完成了这个方法:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.ConvertWebApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
//Apikey.setApiKeyPrefix("Token");
ConvertWebApi apiInstance = new ConvertWebApi();
HtmlToTextRequest input = new HtmlToTextRequest(); // HtmlToTextRequest | HTML to Text request parameters
try {
HtmlToTextResponse result = apiInstance.convertWebHtmlToTxt_0(input);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling ConvertWebApi#convertWebHtmlToTxt_0");
e.printStackTrace();
}
我要演示的最后一个API迭代可用于执行前两个操作的逆操作:从文本字符串中删除HTML。要调用这个API,我们需要格式化输入请求,如下面的例子所示:
<?xml version="1.0" encoding="UTF-8"?>
<RemoveHtmlFromTextRequest>
<TextContainingHtml>string</TextContainingHtml>
</RemoveHtmlFromTextRequest>
一旦我们的请求被格式化,我们可以通过下面的最终代码示例传递该请求,它将返回一个普通的TextContentResult字符串:
// Import classes:
//import com.cloudmersive.client.invoker.ApiClient;
//import com.cloudmersive.client.invoker.ApiException;
//import com.cloudmersive.client.invoker.Configuration;
//import com.cloudmersive.client.invoker.auth.*;
//import com.cloudmersive.client.EditTextApi;
ApiClient defaultClient = Configuration.getDefaultApiClient();
ApiKeyAuth Apikey = (ApiKeyAuth) defaultClient.getAuthentication("Apikey");
Apikey.setApiKey("YOUR API KEY");
//Apikey.setApiKeyPrefix("Token");
EditTextApi apiInstance = new EditTextApi();
RemoveHtmlFromTextRequest request = new RemoveHtmlFromTextRequest(); // RemoveHtmlFromTextRequest | Input request
try {
RemoveHtmlFromTextResponse result = apiInstance.editTextRemoveHtml(request);
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling EditTextApi#editTextRemoveHtml");
e.printStackTrace();
}
有了这三种解决方案,你就可以通过脑子里的三种不同的用例轻松地将HTML和纯文本区分开。每个API解决方案都返回一个简单的纯文本字符串,可以在任何富文本编辑器或纯文本编辑器中轻松查看和编辑。