今回の記事は前回の応用となります
こちらの記事を参考にYahooサイトのwebスクレイピングをします
import requests
from bs4 import BeautifulSoup
import re
url = "https://www.yahoo.co.jp/"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
elems = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))
for elem in elems:
print(elem.contents[0])
print(elem.attrs['href'])
pickup_links = [elem.attrs['href'] for elem in elems]
print(pickup_links)
空のリストを作成しスクレイピングしたテキストを入れる
#空のリストを作成
text_news = []
#一覧のリンクを順に処理
for pickup_link in pickup_links:
#Pickupページへ遷移しページの情報を取得
pickup_res = requests.get(pickup_link)
pickup_soup = BeautifulSoup(pickup_res.text, "html.parser")
#ニュースページへのリンクを取得
pickup_elem = pickup_soup.find("p", class_="sc-bYzVrU umXBl")
news_link = pickup_elem.contents[0].attrs['href']
#ニュースページの情報を取得
news_res = requests.get(news_link)
news_soup = BeautifulSoup(news_res.text, "html.parser")
#タイトルとURLを表示
print(news_soup.title.text)
print(news_link)
#ニュースのテキスト情報を取得し表示
detail_text = news_soup.find(class_=re.compile("highLightSearchTarget"))
print(detail_text.text if hasattr(detail_text, "text") else '',end='\n\n\n\n')
#ニュースのテキスト情報を入力
text_news.append(detail_text)
リストにニュースのテキストが入る
text_news
を実行するとテキストが表示されると思います
空のリストを作成し
リストの中にテキストをスクレイピングでまとめることができました
次にデータ前処理を行います
#リストの要素すべて取り出し
for v in text_news:
print(text_news.index(v), v)
こちらを参考にソースコードを作りました
#リストの要素取りだして解析する
text_news_0=text_news[0]
str_text_news_0=str(text_news_0)
str_text_news_0
#テキストの除去
def clean_text(text):
replaced_text = text.lower()
replaced_text = re.sub(r'[【】]', ' ', replaced_text) # 【】 <>"の除去
replaced_text = re.sub(r'[()()]', ' ', replaced_text) # ()の除去
replaced_text = re.sub(r'[[]\[\]]', ' ', replaced_text) # []の除去
replaced_text = re.sub(r'[@@]\w+', '', replaced_text) # メンションの除去
replaced_text = re.sub(
r'https?:\/\/.*?[\r\n ]', '', replaced_text) # URLの除去
replaced_text = re.sub(r' ', ' ', replaced_text) # 全角空白の除去
return replaced_text
clean_text_list_0=clean_text(str_text_news_0)
clean_text_list_0
形態素解析 MeCabを利用します
!pip install mecab-python3
!pip install unidic
!python -m unidic download
インストール後解析を実施します
import MeCab
import unidic
mecab = MeCab.Tagger()
print(mecab.parse(clean_text_list_0))
MeCab.Tagger('-Owakati') でシンプルに解析
import MeCab
import unidic
mecab = MeCab.Tagger('-Owakati')
print(mecab.parse(clean_text_list_0))
特定の品詞だけ取り出します
import MeCab
# 取り出したい品詞
select_conditions = ['動詞', '形容詞', '名詞']
# 分かち書きオブジェクト
tagger = MeCab.Tagger('')
# Neologdの指定版 最新語に対応する
# tagger = MeCab.Tagger('-d /usr/lib64/mecab/dic/mecab-ipadic-neologd')
# 安定するらしい
tagger.parse('')
def wakati_text(text):
"""
文書textを分かち書きして、半角スペース区切りの単語文字列に変換する
Parameters
----------
text: str
文書
Returns
-------
text_result: str
分かち書きされた文書
"""
# 分けてノードごとにする
node = tagger.parseToNode(text)
terms = []
while node:
# 単語
term = node.surface
# 品詞
pos = node.feature.split(',')[0]
# もし品詞が条件と一致してたら
if pos in select_conditions:
terms.append(term)
node = node.next
# 連結おじさん
text_result = ' '.join(terms)
return text_result
text = clean_text_list_0
print(wakati_text(text))
wakati_text=wakati_text(text)
データベースなどに蓄積
できれば有効活用できる特徴量になるかもしれません!