はじめに
サイトリニューアルのとき、データ移行作業がよくあります。
手動作業はできますが、コストかかりますので、
バッチで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構造
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
以上