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


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

https://qiita.com/TaichiEndoh/items/58323ce3d6aeb36b80c5

こちらの記事を参考にYahooサイトのwebスクレイピングをします

https://ai-inter1.com/beautifulsoup_1/


```
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)

```
https://zenn.dev/deepblackinc/books/5dd1d3acfcfd9e/viewer/07ad11

こちらを参考にソースコードを作りました

```
#リストの要素取りだして解析する
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を利用します


https://omathin.com/morphological-analysis/

```
!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))
```

特定の品詞だけ取り出します

https://qiita.com/ganyariya/items/68fdcfed953f066ad4b7


```
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)
```

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