日本経済新聞の記事検索結果の分析を手作業でやっていましたが、さすがに飽きてきた(まさにBoring)のでPython / Beautiful Soupを使って手抜きを図りました。
なお、日経記事の利用やリンクにあたっては、同社の「著作権について」や「リンクポリシー」などを参照して知的財産権の扱いを必ず確認されることを推奨します。
検索結果HTMLの構造
記事の単位
日経記事検索の結果のHTMLファイルを見ると、検索結果の情報はひとつの記事単位で以下のような<div></div>タグの間に、十数行にわたって情報の要素が入っていることがわかります。なので、記事ごとの情報はこのタグを単位に整理すれば良さそうです。
(記事単位の検索結果)
日時、タイトル及び記事のURL情報
日時、タイトル及びURLの情報は、上記の<div class=”search__result-item”></div>タグの間で、日時は<time>タグの中に、タイトル及び記事のURLは<a>タグのに中に、それぞれ入っていました。
日時の情報は、<time>タグ中のdatetimeとtitleの両方に入っており、用途によって好きな方から取ってくれば良いので、今回は日本時間を前提としてtitleから取って来ることにしました。
<time aria-label="3時間前" class="nui-date" data-nui-date="" datetime="2019-09-06T06:52:02+09:00" title="2019年9月6日 6:52">
タイトルの情報は、<a>タグ中のtitleから、URLはhrefから、それぞれ取って来ることにしました。タイトルは<a></a>の間から.getText()する手もありますが、コードの見た目を揃えたいのでtitleから取得。
【水位上昇】トイレが詰まりました、助けてください【迫る危機】
整理結果のCVSファイル書き出し
抽出結果の確認
話が前後しますが、検索結果はあらかじめHTMLファイル(search-rslt.html)に落としておいて、落ち着いてBeautiful Soupで読み込みこんで出力の雰囲気を確認しました。
#HTMLファイル読み込み with open("search-rslt.html") as wrapper: soup = bs4.BeautifulSoup(wrapper, "lxml") #(記事単位の検索結果)の中身をresultantItemsに格納する。 resultantItems = soup.find_all('div', 'search__result-item') #記事単位でanItemとして取り出し、要素を抽出する。 for anItem in resultantItems: print( anItem.find('time').get('title') + '\n' + anItem.find('a').get('title') + '\n' + anItem.find('a').get('href') + '\n' )
まずはprintしてみると、こんな感じになりました。⬇️
なお、検索に使ったキーワードは「ツイッター」でしたが、結果を見るとツイッターが如何に荒廃した場所かよくわかります😉
は、ともかく、結果は問題なさそうです。
2019年9月6日 3:17
ジョンソン英首相の弟、閣外相辞任 EU離脱で確執
https://www.nikkei.com/article/DGXMZO49486760W9A900C1000000
2019年9月6日 0:24
<米国>エヌビディアが6%高 米中が閣僚級の貿易協議開催で
https://www.nikkei.com/article/DGXLASFL05I29_V00C19A9000000
2019年9月5日 15:08
36%がネットいじめ被害 世界の若者、ユニセフ調査
https://www.nikkei.com/article/DGXMZO49445430V00C19A9000000
2019年9月5日 10:58
香港政府の賭け、つかの間の薄日か
https://www.nikkei.com/article/DGXMZO49434320V00C19A9000000
2019年9月5日 6:00
「うんこミュージアム」をヒットさせたのはうんこのことをクソほど考えた32歳だった
https://www.nikkei.com/article/DGXMZO49325660S9A900C1I10000
CSVファイルへの書き出し
printのスクリプトを改造してstring(out_f)に書き出した後、CSV(output.csv)に書き出します。
#stringに書き出して、 resultantItems = soup.find_all('div', 'search__result-item') out_f = '' for anItem in resultantItems: out_f += ( anItem.find('time').get('title') + ',' + anItem.find('a').get('title') + ',' + anItem.find('a').get('href') + '\n' ) #CSVに書き出し。 import csv with open('output.csv', 'w') as f: f.write(out_f)