rfriendsでラジオ録音

ラジコ、らじるらじる、タイムフリーのラジオ番組を録音

xpathを使ってNHKゴガク「小学生の基礎英語」のデータを抽出する方法

dom,xpathを使ったデータ抽出について説明する。

1.「小学生の基礎英語」のWEBページ

小学生の基礎英語の2月第1週を例に説明する。

WEBページ

https://www.nhk.or.jp/gogaku/basic0/202302/1/

より関係個所のhtmlのソースを抜粋する。

これを見ると3つのデータがあることがわかる。

div classに注目すると、divタグでclassがnol_audio_playerを探せばいい。
また、タイトルはdata-title、m3u8データはdata-hlsurlで得られることがわかる。

<div class="nol_audio_player" style="display:none;"
	data-aa="vod;小学生の基礎英語_2023年01月30日_Lesson121;r2,130;2023013099999;2023-01-30T10:00:00+09:00_2099-12-31T10:00:00+09:00"
	data-code="4251521"
	data-hlsurl="https://vod-stream.nhk.jp/gogaku-stream//22-ek0-4251-521/index.m3u8"
	data-title="小学生の基礎英語 2023年01月30日 Lesson121"
	data-skin="white2"
	data-type="ONDEMAND"
	data-autoplay="false">
</div>
<div class="nol_audio_player" style="display:none;"
	data-aa="vod;小学生の基礎英語_2023年02月01日_Lesson122;r2,130;2023020199999;2023-02-01T10:00:00+09:00_2099-12-31T10:00:00+09:00"
	data-code="4251522"
	data-hlsurl="https://vod-stream.nhk.jp/gogaku-stream//22-ek0-4251-522/index.m3u8"
	data-title="小学生の基礎英語 2023年02月01日 Lesson122"
	data-skin="white2"
	data-type="ONDEMAND"
	data-autoplay="false">
</div>
<div class="nol_audio_player" style="display:none;"
	data-aa="vod;小学生の基礎英語_2023年02月03日_Lesson123;r2,130;2023020399999;2023-02-03T10:00:00+09:00_2099-12-31T10:00:00+09:00"
	data-code="4251523"
	data-hlsurl="https://vod-stream.nhk.jp/gogaku-stream//22-ek0-4251-523/index.m3u8"
	data-title="小学生の基礎英語 2023年02月03日 Lesson123"
	data-skin="white2"
	data-type="ONDEMAND"
	data-autoplay="false">
</div>

2.dom,xpathを使ってデータ抽出を行う

以下にxpathを使ったクエリ方法をPHPで記述する。

//
// htmlデータを取得(小学生の基礎英語の2月第1週)。
//
$url = "https://www.nhk.or.jp/gogaku/basic0/202302/1/";
$html = file_get_contents($url);
//
// 小学生の基礎英語の2月第1週のhtmlよりdiv[@class="nol_audio_player"をクエリ
//
// htmlをdomドキュメント化し、xpathでクエリする。
// @はhtmlが規則に従っていない場合ワーニングが出るため、その抑止
// クエリ結果は$nodesに格納
$query = '//div[@class="nol_audio_player"]';
$domDocument = new DOMDocument();
@$domDocument->loadHTML($html);
$xpath = new DOMXPath($domDocument);
$nodes = $xpath->query($query);
//
// 小学生の基礎英語の2月第1週のデータ(3つ)を取得
// 各データは属性なので、getAttributeを使用
$data-title  = array();
$data-hlsurl = array();
foreach ($nodes as $node) {
    $data-title[]  = $node->getAttribute('data-title');
    $data-hlsurl[] = $node->getAttribute('data-hlsurl');
}

3.その他

この応用で、htmlからデータ抽出が割と簡単にできるようになる。
また、ほかの言語に置き換えるのも簡単だとおもう。

 

雰囲気だけでもつかんでいただけたら幸いです。

以上