15
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JAVAでHTML解析(スクレイピング)

Last updated at Posted at 2019-09-09

はじめに

サイトリニューアルのとき、データ移行作業がよくあります。
手動作業はできますが、コストかかりますので、
バッチでHTML取得⇒解析⇒新システムに投入 というような機能が役に立つ場合があります。

Javaでは、jsoupというライブラリは有名です。
Pythonでは、beautifulsoup4 というライブラリは有名です。

jsoup: https://jsoup.org/
beautifulsoup4: https://pypi.org/project/beautifulsoup4/

1 jsoup

jsoupはHTML解析のJAVAライブラリです。jquery-likeのセレクターで簡単にHTML解析できます。
WHATWG HTML5 仕様を対応しております。

1-1 JAVAプロジェクト作成し、ライブラリ導入

Gradle例:

// https://mvnrepository.com/artifact/org.jsoup/jsoup
compile group: 'org.jsoup', name: 'jsoup', version: '1.12.1'

1-2 Yahooニュースのタイトルの取得例

1-2-1 HTML構造

image.png

1-2-2 タイトルとURLを抽出するシンプルな解析コード

package com.test.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupHtmlParser {

	public static void main(String[] args) throws IOException {
		Document doc = Jsoup.connect("https://news.yahoo.co.jp").get();
		// 各記事のaタグを取得。jQueryのセレクターと同じ感じで記載
		Elements newsHeadlines = doc.select(".topicsList li.topicsListItem a");
		for (Element headline : newsHeadlines) {
			System.out.println("title: " + headline.ownText() + ",  href: " + headline.absUrl("href"));
		}
	}
}

1-2-3 解析結果

title: 台風で記録的暴風、2人死亡,  href: https://news.yahoo.co.jp/pickup/6336014
title: 成田空港 1万人でごった返す,  href: https://news.yahoo.co.jp/pickup/6336017
title: 警備会社の3.6億円盗む 手配,  href: https://news.yahoo.co.jp/pickup/6336018
title: 計画運休 ダイヤの正常化課題,  href: https://news.yahoo.co.jp/pickup/6336013
title: バズる女子大生 炎上で50回涙,  href: https://news.yahoo.co.jp/pickup/6335993
title: バスケW杯5敗目 3P全部外す,  href: https://news.yahoo.co.jp/pickup/6336020
title: NPB プロスポーツ協会を脱退,  href: https://news.yahoo.co.jp/pickup/6336015
title: 吉沢亮「重圧尋常じゃない」,  href: https://news.yahoo.co.jp/pickup/6336022

1-3 HTML文字列の解析

1-3-1 解析サンプル

package com.test.jsoup;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;

public class JsoupHtmlParser {

	public static void main(String[] args) throws IOException {
		String html = "<h1>HTML fragmentの解析</h1><div><p>P1</p>";
		Document doc = Jsoup.parseBodyFragment(html);
		
		// docのそのまま出力すると、html,bodyタグが付加されましたので、fragment解析の場合は要注意
		System.out.println(doc.html());
		
		System.out.println("==========================");
		
		// bodyの要素を出力
		Element body = doc.body();
		System.out.println(body.html());
	}
}

1-3-2 解析結果

<html>
 <head></head>
 <body>
  <h1>HTML fragmentの解析</h1>
  <div>
   <p>P1</p>
  </div>
 </body>
</html>
==========================
<h1>HTML fragmentの解析</h1>
<div>
 <p>P1</p>
</div>

そのほか、ファイルからHTML解析、データ抽出、データ修正などサイトにわかりやすいサンプルコードがあります。
https://jsoup.org/cookbook/input/load-document-from-file

以上

15
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?