將文件檔案轉換成為文字內容系列 - HTML
在 上一篇文章 有討論到如何將 PDF 文件檔案轉換成為文字內容,在這份文章中,將會是這個轉換成為文字內容系列文章的第 2 個,在這裡將會探討如何將 HTML 類型的檔案,抽取出裡面的文字內容出來。
HTML(HyperText Markup Language,超文本標記語言)是一種標準的網頁標記語言,用於描述網頁的結構和內容。它不是一種程式語言,而是一種用於組織和展示網頁元素(如文本、圖像、超連結等)的標記語言。
HTML 文件包含一系列的標籤(tags),這些標籤用來標記不同的網頁元素,例如段落、標題、列表等。瀏覽器會解析這些標籤,並根據它們的含義將內容呈現給用戶。
HTML 是網頁開發的基礎,通常與 CSS(Cascading Style Sheets,層疊樣式表)和 JavaScript 一起使用,分別負責網頁的外觀和互動功能。這三個技術共同構成了網頁開發的核心。
由於這裡需要的純文字,將會是使用者在瀏覽器上看到的各種文字,所以,對於 HTML 檔案內的各種標籤 (Tags) 、CSS、JavaScript 等這些內容,將需要忽略掉。
建立可以將 HTML 檔案轉換出文字內容的測試專案
為了簡化測試用專案的複雜度,因此,在這裡將會建立一個 Console 主控台應用類型的專案。
- 打開 Visual Studio 2022 IDE 應用程式
- 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
- 在 [建立新專案] 對話窗右半部
- 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
- 切換 [所有專案類型 (T)] 下拉選單控制項為 [主控台]
- 在中間的專案範本清單中,找到並且點選 [主控台應用程式] 專案範本選項
專案,用於建立可在 Windows、Linux 及 macOS 於 .NET 執行的命令列應用程式
- 點選右下角的 [下一步] 按鈕
- 在 [設定新的專案] 對話窗
- 找到 [專案名稱] 欄位,輸入
csHtml2Text
作為專案名稱 - 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
- 點選右下角的 [下一步] 按鈕
- 現在將會看到 [其他資訊] 對話窗
- 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 :
.NET 7.0 (標準字詞支援)
- 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項
這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項
- 請點選右下角的 [建立] 按鈕
稍微等候一下,這個主控台專案將會建立完成
安裝要用到的 NuGet 開發套件
因為開發此專案時會用到這些 NuGet 套件,請依照底下說明,將需要用到的 NuGet 套件安裝起來。
安裝 HtmlAgilityPack 套件
HtmlAgilityPack(HAP)是一個針對 C# 開發環境的 HTML 解析和操作庫。它提供了一個易於使用和高效的 API,讓開發者能夠對 HTML 文件進行各種操作,如讀取、修改和操作 HTML 內容。
HtmlAgilityPack 的主要功能和目的包括:
- HTML 解析:能夠解析不規範和破碎的 HTML 代碼,並將其轉換成一個可操作的對象模型,方便開發者進行後續操作。
- 查詢和選擇節點:提供了類似 XPath、CSS 選擇器等方式,讓開發者能夠快速地定位和選擇 HTML 文件中的指定元素。
- 修改 HTML 內容:允許開發者對 HTML 內容進行修改,如增加、刪除或修改元素的屬性、標籤名和內容等。
- 遍歷 HTML 節點:可以對 HTML 文件進行遍歷,讓開發者更方便地查找和處理指定的節點或元素。
- HTML 轉換:支持將 HTML 內容轉換成其他格式,如 XML、JSON等,以便於進行後續處理。
- 網絡爬蟲:可以擴展 HtmlAgilityPack 的功能,以實現簡單的網頁抓取和內容提取。
總之,HtmlAgilityPack 是一個強大且靈活的 HTML 處理套件,適用於 C# 開發環境。它可以幫助開發者更高效地解析和操作 HTML 內容,進行網頁資料提取或構建網頁爬蟲等任務。
請依照底下說明操作步驟,將這個套件安裝到專案內
- 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
- 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
- 此時,將會看到 [NuGet: csHtml2Text] 視窗
- 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
- 在左上方找到一個搜尋文字輸入盒,在此輸入
HtmlAgilityPack
- 稍待一會,將會在下方看到這個套件被搜尋出來
- 點選 [HtmlAgilityPack] 套件名稱
- 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
- 點選這個 [安裝] 按鈕,將這個套件安裝到專案內
準備需要抽取文字內容的 HTML 檔案
準備好一個 [.html] 文件檔案
在這裡將會從網路上,隨機找到一個 [【筆記】範本.html] 檔案
取得該檔案之後,將其透過檔案總管拖拉到 Visual Studio 2022 的專案內
接著,點選 [【筆記】範本.html] 檔案
查看 [屬性] 視窗的內容
若沒有看到屬性視窗出現在 Visual Studio 2022 內,請從 Visual Studio 2022 功能表中,點選 [檢視] > [屬性視窗]
(這個選項將會在功能表清單內的最下面)
在屬性視窗內,找到 [複製到輸出目錄] 這個選項
從下拉選單中找到並且設定為這個 [有更新時才複製] 選項
開始進行轉檔程式設計
- 在此專案節點下,找到並且打開 [Program.cs] 這個檔案
- 使用底下 C# 程式碼替換掉 [Program.cs] 檔案內所有程式碼內容
using System;
using HtmlAgilityPack;
namespace HtmlToText
{
class Program
{
static void Main(string[] args)
{
string htmlContent = File.ReadAllText("【筆記】範本.html");
// 將 HTML 內容轉換為純文本
var textContent = ConvertHtmlToPlainText(htmlContent);
// 將純文本內容顯示在螢幕上
Console.WriteLine(textContent);
}
static string ConvertHtmlToPlainText(string htmlContent)
{
var htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(htmlContent);
// 刪除所有 script 和 style 節點
RemoveNodeByTag(htmlDoc, "script");
RemoveNodeByTag(htmlDoc, "style");
// 取得網頁的純文本內容
string plainText = htmlDoc.DocumentNode.InnerText;
// 刪除多餘的空格和換行符
plainText = System.Text.RegularExpressions.Regex.Replace(plainText, @"\s+", " ").Trim();
return plainText;
}
static void RemoveNodeByTag(HtmlDocument htmlDoc, string tagName)
{
var nodes = htmlDoc.DocumentNode.SelectNodes($"//{tagName}");
if (nodes != null)
{
foreach (var node in nodes)
{
node.Remove();
}
}
}
}
}
因為 HTML 格式的檔案,其本身就是一個文字格式內容,所以,首先使用 [File.ReadAllText] 方法,將一個 HTML 檔案內容全部讀取出來,這裡使用 htmlContent 區域變數來儲存這些文字內容。
在此設計一個 [ConvertHtmlToPlainText] 方法,可以用來將傳入的 HTML 標籤內容,抽取出要顯示出來的文字內容,精煉後的文字將會儲存在 textContent 區域變數內
在 [ConvertHtmlToPlainText] 方法內,建立一個 [HtmlDocument] 物件,並且使用 [LoadHtml] 方法把整個 HTML 內容用來讀取進來,接著退去對不會用到的標籤,使用 [htmlDoc.DocumentNode.InnerText] 屬性,取出網頁內純文字內容,最後,刪除掉多餘的空格和換行字元,這樣就可以得到該 HTML 內的純文字內容了。
最後,將所有的文字內容輸出到螢幕上
底下將會是執行後的螢幕截圖結果
而原始的 HTML 在瀏覽器上看到的畫面如下:
沒有留言:
張貼留言