LoginSignup
2

posted at

updated at

pythonで気軽にwebスクレイピング → 形態素解析

今回の記事は前回の応用となります

こちらの記事を参考に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)

データベースなどに蓄積
できれば有効活用できる特徴量になるかもしれません!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2