Python:Yahoo!ニューストピックスをターミナルに表示する

Pythonのロゴ Python

Pythonを使ってYahoo!ニューストピックスをターミナルに表示する、という事をやってみます。

このPythonプログラムは、仕事中にブラウザ以外でニュース情報を見ることは出来ないかという不謹慎な理由で考えたものです。
という訳で、Pythonのスクレイピングの悪い例として御覧ください。

Pythonとスクレイピングするためのライブラリbeautifulsoup4を使います。

beautifulsoup4のインストール方法

pip install beautifulsoup4

又は

pip3 install beautifulsoup4

ヤフーニューストピックスのサイトは常に情報が更新されている以下のRSSサイトを使います。

Yahoo!ニュース
Yahoo!ニュースは、新聞・通信社が配信するニュースのほか、映像、雑誌や個人の書き手が執筆する記事など多種多様なニュースを掲載しています。

実際に上記のサイトから得られる文字データは例としてこんな感じです。

<rss version="2.0">
<channel>
<title>Yahoo!ニュース・トピックス - 主要</title>
<link>https://news.yahoo.co.jp/</link>
<description>Yahoo! JAPANのニュース・トピックスで取り上げている最新の見出しを提供しています。</description><language>ja</language><pubDate>Sun, 06 Jan 2019 21:59:42 +0900</pubDate>
<item>
<title>照射問題 韓国艦艇は警告せず</title>
<link>https://news.yahoo.co.jp/pickup/6309220</link>
<pubDate>Sun, 06 Jan 2019 21:55:43 +0900</pubDate>
<enclosure length="133" url="https://s.yimg.jp/images/icon/photo.gif" type="image/gif"></enclosure>
<guid isPermaLink="false">yahoo/news/topics/6309220</guid>
</item>
<item>
<title>入学願書の性別欄 廃止広がる</title>
<link>https://news.yahoo.co.jp/pickup/6309214</link>
<pubDate>Sun, 06 Jan 2019 20:20:01 +0900</pubDate>
<enclosure length="133" url="https://s.yimg.jp/images/icon/photo.gif" type="image/gif">
</enclosure>
<guid isPermaLink="false">yahoo/news/topics/6309214</guid>
</item>
<item>
<title>ゴーン容疑者息子 仏紙に語る</title>
<link>https://news.yahoo.co.jp/pickup/6309216</link>
<pubDate>Sun, 06 Jan 2019 21:20:12 +0900</pubDate>
<enclosure length="133" url="https://s.yimg.jp/images/icon/photo.gif" type="image/gif">
</enclosure>
<guid isPermaLink="false">yahoo/news/topics/6309216</guid>
:
:

このデータを見るとtitleタグで囲まれた部分がニューストピックスだと分かります。
これをbeautifulsoup4を使って取り出します。

まず、以下の2つをインポートしておきます。

import urllib.request
from bs4 import BeautifulSoup

URLさえ分かっていればそのサイトのHTML情報は、urllib.request.urlopen関数で簡単に取り出せます。

# ニュースサイトを開く
url = "https://news.yahoo.co.jp/pickup/rss.xml"
response = urllib.request.urlopen(url)

あとは、beautifulsoup4を使ってタグ内の文字列を取得するだけです。

# HTMLを解析して取得
html = BeautifulSoup(response, 'html.parser')

今回のようにtitleタグが複数あるような場合、find_allを使って取り出します。find_allの引数はタグ名。
取得したデータ(変数topics)はリスト形式となります。

# トピックスの部分を取得
topics = html.find_all("title")

あとはfor文などでリストデータを取り出すわけですが、そのまま取り出すとタグ部分も取得されてしまいます。

例:

<title>入学願書の性別欄 廃止広がる</title>

ですので実際は、変数のあとに.stringをつけてタグの中身だけを取り出します。

for item in topics:
	print(item.string)

ソースコード全体
checkYahooNews.py

実行イメージ

Yahoo!ニュース・トピックス - 主要
  1: 雪で欠航の新千歳 8日も影響
  2: インフル集団感染 1人死亡
  3: 文氏10日会見 日韓関係語るか
  4: 矛盾した涙 出生前診断必要か
  5: ファッション 平成でどう変遷
  6: 速報 錦織vs.メドベージェフ
  7: NBA選手 暗殺恐れと遠征拒否
  8: 妖精役で起用 遠藤憲一の魅力

コメント

タイトルとURLをコピーしました