HTMLの解析は、Java開発において非常に重要な処理のひとつです。構造化データの抽出、コンテンツ分析、Webベースの情報活用など、さまざまな場面で活用されます。Webスクレイパーの構築、HTMLコンテンツの検証、Webページからのテキストや属性の抽出など、用途は多岐にわたりますが、信頼性の高いツールを使うことで実装は大幅に簡素化できます。 本ガイドでは、Spire.Doc for Java を使用して JavaでHTMLを解析する方法 を解説します。Spire.Docは、HTML解析とドキュメント処理を統合的に扱える強力なライブラリで、実用的なHTMLデータ抽出を効率よく実装できます。 HTML解析にSpire.Doc for Javaを使う理由 環境準備とインストール 基本編:JavaでHTMLを解析して要素を抽出する 応用編:HTMLファイル・URLを解析する HTML解析に関するFAQ HTML解析にSpire.Doc for Javaを使う理由 JavaにはJsoupなど複数のHTML解析ライブラリがありますが、Spire.Docはドキュメント処理との親和性と低コードで実装できる点が大きな特長です。効率を重視する開発者にとって、以下の理由からHTML解析用途に適しています。 直感的なオブジェクトモデルHTMLを Section、Paragraph、Table などの構造化されたオブジェクトに変換し、生のHTMLタグを直接処理する必要がありません。 幅広いデータ抽出機能テキスト、属性、表データ(行・セル)、見出しなどのスタイル情報まで、追加ライブラリなしで取得できます。 低コードワークフローHTMLの読み込みから処理まで、最小限のコードで実装でき、開発時間を短縮できます。 軽量な導入MavenやGradleで簡単にプロジェクトへ追加でき、依存関係も最小限です。 環境準備とインストール JavaでHTMLを読み込む前に、以下の環境が整っていることを確認してください。 Java Development Kit (JDK)JDK 8以上(URL解析で HttpClient を使用する場合は JDK 11以上を推奨) Spire.Doc for Java最新バージョン(Maven または手動で導入) HTMLソースHTML文字列、ローカルHTMLファイル、またはURL(動作確認用) Spire.Doc for Javaのインストール Mavenを使用する場合以下のリポジトリと依存関係を pom.xml に追加します。必要なライブラリは自動的にダウンロードされます。 <repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url> </repository> </repositories> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.doc</artifactId> <version>13.12.2</version> </dependency> 手動で導入する場合は、公式サイト からJARファイルをダウンロードし、プロジェクトに追加してください。 一時ライセンスの取得 デフォルトでは、Spire.Docの出力結果に評価用ウォーターマークが付与されます。制限を解除するには、30日間の無料トライアルライセンス を申請できます。 基本編:JavaでHTMLを解析して要素を抽出する Spire.Docは、HTMLを構造化されたドキュメントモデルに変換します。段落、表、フィールドなどの要素をJavaオブジェクトとして直接操作できるため、データ抽出が容易になります。ここでは代表的なケースを紹介します。 1. JavaでHTMLからテキストを抽出する HTMLタグを除外した純粋なテキスト抽出は、全文検索やコンテンツ分析でよく使われます。以下の例では、HTML文字列を解析し、すべての段落テキストを取得します。 Javaコード:HTML文字列からテキストを抽出 import com.spire.doc.*; import com.spire.doc.documents.*; public class ExtractTextFromHtml { public static void main(String[] args) { // 解析するHTMLコンテンツを定義 String htmlContent = "<html>" + "<body>" + "<h1>HTML解析の概要</h1>" + "<p>Spire.Doc for Java を使用すると、HTMLからのテキスト抽出を簡単に行えます。</p>" + "<ul>" + "<li>見出しを抽出</li>" + "<li>段落を抽出</li>" + "<li>リスト項目を抽出</li>" + "</ul>" + "</body>" + "</html>"; // 解析したHTMLを格納するためのDocumentオブジェクトを作成 Document doc = new Document(); // HTML文字列をドキュメントに解析して追加 doc.addSection().addParagraph().appendHTML(htmlContent); // すべての段落からテキストを抽出 StringBuilder extractedText = new StringBuilder(); for (Section section : (Iterable<Section>) doc.getSections()) { for (Paragraph paragraph : (Iterable<Paragraph>) section.getParagraphs()) { extractedText.append(paragraph.getText()).append("n"); } } // 抽出したテキストを出力または後続処理 System.out.println("抽出されたテキスト:n" + extractedText); } } 出力例: 2. JavaでHTMLテーブルのデータを抽出する HTMLの <table> 要素は、商品一覧やレポートなどの構造化データを含むことが多くあります。Spire.Docでは、HTMLテーブルを Table オブジェクトとして扱えるため、行やセル単位で簡単にアクセスできます。 Javaコード:HTMLテーブルの行・セルを抽出 import com.spire.doc.*; import com.spire.doc.documents.*; public class ExtractTableFromHtml { public static void main(String[] args) { // テーブルを含むHTMLコンテンツ String htmlWithTable = "<html>" + "<body>" + "<table border=&#39;1&#39;>" + "<tr><th>ID</th><th>商品名</th><th>価格</th></tr>" + "<tr><td>001</td><td>ノートパソコン</td><td>$999</td></tr>" + "<tr><td>002</td><td>スマートフォン</td><td>$699</td></tr>" + "</table>" + "</body>" + "</html>"; // HTMLをDocumentオブジェクトに解析して読み込む Document doc = new Document(); doc.addSection().addParagraph().appendHTML(htmlWithTable); // テーブルデータを抽出 for (Section section : (Iterable<Section>) doc.getSections()) { // セクション本文内のすべてのオブジェクトを走査 for (Object obj : section.getBody().getChildObjects()) { if (obj instanceof Table) { // オブジェクトがテーブルかどうかを判定 Table table = (Table) obj; System.out.println("テーブル内容:"); // 行を順に処理 for (TableRow row : (Iterable<TableRow>) table.getRows()) { // 行内のセルを順に処理 for (TableCell cell : (Iterable<TableCell>) row.getCells()) { // 各セル内の段落からテキストを抽出 for (Paragraph para : (Iterable<Paragraph>) cell.getParagraphs()) { System.out.print(para.getText() + "t"); } } System.out.println(); // 各行の後で改行 } } } } } } 出力例: appendHTML() メソッドでHTMLをWordドキュメントとして解析した後、Spire.DocのAPIを使って ハイパーリンクを抽出 することも可能です。 応用編:HTMLファイル・URLを解析する Spire.Doc for Javaは、ローカルHTMLファイルやWeb上のURLからHTMLを解析することもでき、実運用に適した柔軟性を備えています。 1. JavaでHTMLファイルを読み込む ローカルのHTMLファイルは、loadFromFile(String, FileFormat.Html) メソッドを使用して読み込みます。 Javaコード:ローカルHTMLファイルを解析 import com.spire.doc.*; import com.spire.doc.documents.*; public class ParseHtmlFile { public static void main(String[] args) { // Documentオブジェクトを作成 Document doc = new Document(); // HTMLファイルを読み込む doc.loadFromFile("input.html", FileFormat.Html); // テキストを抽出して出力 StringBuilder text = new StringBuilder(); for (Section section : (Iterable<Section>) doc.getSections()) { for (Paragraph para : (Iterable<Paragraph>) section.getParagraphs()) { text.append(para.getText()).append("n"); } } System.out.println("HTMLファイルから抽出したテキスト:n" + text); } } この例ではHTMLファイル内のテキストを抽出しています。段落のスタイル(例:「Heading1」「Normal」)も同時に取得したい場合は、Paragraph.getStyleName() メソッドを使用します。 出力例: 関連情報:JavaでWordをHTMLに変換 2. JavaでURLを解析する 実際のWebスクレイピングでは、URLからHTMLを取得して解析する必要があります。Spire.Docは、JDK 11以降で利用可能な HttpClient と組み合わせて使用できます。 Javaコード:URLからHTMLを取得して解析 import com.spire.doc.*; import com.spire.doc.documents.*; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.time.Duration; public class ParseHtmlFromUrl { // 再利用可能な HttpClient(タイムアウトを設定してハングアップを防ぐ) private static final HttpClient httpClient = HttpClient.newBuilder() .connectTimeout(Duration.ofSeconds(10)) .build(); public static void main(String[] args) { String url = "https://jp.e-iceblue.com/misc/privacy-policy.html"; try { // URLからHTMLコンテンツを取得 System.out.println("Fetching from: " + url); String html = fetchHtml(url); // Spire.DocでHTMLを解析 Document doc = new Document(); Section section = doc.addSection(); section.addParagraph().appendHTML(html); System.out.println("--- 見出し ---"); // 見出しを抽出 for (Paragraph para : (Iterable<Paragraph>) section.getParagraphs()) { // 段落スタイルが見出しかどうかを確認(例:"Heading1", "Heading2") if (para.getStyleName() != null && para.getStyleName().startsWith("Heading")) { System.out.println(para.getText()); } } } catch (Exception e) { System.err.println("エラー: " + e.getMessage()); } } // ヘルパーメソッド: 指定したURLからHTMLコンテンツを取得 private static String fetchHtml(String url) throws Exception { // User-Agentヘッダー付きでHTTPリクエストを作成(ブロック回避のため) HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .header("User-Agent", "Mozilla/5.0") .timeout(Duration.ofSeconds(10)) .GET() .build(); // リクエストを送信してレスポンスを取得 HttpResponse<String> response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); // リクエストが成功したか確認(HTTP 200 = OK) if (response.statusCode() != 200) { throw new Exception("HTTPエラー: " + response.statusCode()); } return response.body(); // 生のHTMLコンテンツを返す } } 処理のポイント: HTTP取得 HttpClientでHTMLを取得し、User-Agentを設定してアクセスブロックを回避します。 HTML解析 DocumentにSectionとParagraphを追加し、appendHTML()でHTMLを読み込みます。 データ抽出 段落スタイルが「Heading」で始まるかを判定し、見出しを抽出します。 出力例: まとめ JavaでのHTML解析は、Spire.Doc for Javaを使うことで大幅に簡素化できます。HTML文字列、ローカルファイル、URLのいずれからでも、テキストや表データを最小限のコードで抽出可能です。生のHTMLタグを直接扱ったり、重い依存関係を管理したりする必要はありません。 Webスクレイピング、コンテンツ分析、HTML変換(例:HTMLをPDFに変換)など、さまざまな用途で活用できます。本ガイドの手順に沿って実装すれば、Javaプロジェクトに実用的なHTML解析機能をスムーズに組み込めるでしょう。 HTML解析に関するFAQ Q1:JavaでHTMLを解析するには、どのライブラリが最適ですか? A:用途によって異なります。 Spire.Doc:HTMLからテキストや表を抽出しつつ、PDF変換などのドキュメント処理も行いたい場合に適しています。 Jsoup:シンプルなHTML解析のみで十分な場合に向いていますが、表や構造化データの処理には追加実装が必要です。 Q2:不完全なHTMLでも解析できますか? A:はい。Spire.Doc for Javaでは、XHTMLValidationType.None を指定して厳密な検証を無効化することで、不完全なHTML構造にも対応できます。 doc.loadFromFile("input.html", FileFormat.Html, XHTMLValidationType.None); ただし、構造が大きく崩れているHTMLでは、解析に失敗する場合があります。 Q3:解析後のHTMLを編集して再保存できますか? A:可能です。段落テキストの編集、表の行削除、新しい要素の追加などを行った後、HTMLとして保存できます。 doc.saveToFile("modified.html", FileFormat.Html); Q4:HTML解析にインターネット接続は必要ですか? A:ローカルファイルやHTML文字列を解析する場合、インターネット接続は不要です。URLからHTMLを取得する場合のみ、事前にネットワーク接続が必要になります。