Pythonのスクレイピングで文字だけを抜き出す汎用的な方法


Pythonのスクレイピングで文字だけきれいに抽出する汎用的な方法

初投稿です。

pythonのスクレイピングで複数のサイトから文字だけ全部抜き出そうとする際に、うまく機能する汎用的なやり方を理解するのにわりと時間がかかったため、ここにしたためておきます。

まず、英語でどんぴしゃり回答していらっしゃる方がいたので、英語いける方はこちらのURLを見ていただければ試合終了です。
Extracting text from HTML file using Python

私はコードを調べつつでないと理解できないPrograming初心者で、割と処理の理解に時間がかかったので、やり方を0から簡単に解説します。必要なところだけさくっと見てください。

事前準備

インストール

import requests
import pandas as pd
from bs4 import BeautifulSoup

HTML取得

html=requests.get("https://www.updateurself.com/2018/11/14/the-way-to-challenge/").text
soup=BeautifulSoup(html,"html.parser")
#print(soup.prettify)

ちなみにこのURLは私がやっているプログラミングとは何の関係もないブログです。

文字を取り出していく

###1, scriptやstyleを含む要素を削除する

for script in soup(["script", "style"]):
    script.decompose()
#print(soup)
  • .decompose()は、削除のメソッドです。

###2, テキストのみを取得=タグは全部取る

text=soup.get_text()
#print(text)

引用:Extracting text from HTML file using Python

.get_text()は、テキストのみを取得する、つまりタグは取らないメソッドです。

###3, textを改行ごとにリストに入れて、リスト内の要素の前後の空白を削除

lines= [line.strip() for line in text.splitlines()]

引用:Extracting text from HTML file using Python

【補足】ここはリスト内包表記です。書き下すと以下のことをやっています。

lines=[]
for line in text.splitlines():
  lines.append(line.strip())
#print(lines)
  • .strip()では引数に指定したものを文字列の文頭文末から削除することができます。
    今回のように引数に何も指定しなければ空白(改行等中身のないもの)を全削除です。
  • .splitlines()は改行ごとに要素をリストに入れます。

出力はこんな感じになります。(最初の部分のみ)

['', '', '', '', '', '', '', '', '', '', '', '', '', '', '人生に目標が無いから何?目標より大事なアレを見つける3つの方法 - Update yourself', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'ホーム', '悩み', '', 'こころ', '人間関係', '恋愛', '', '', '思考法',

(冒頭部分改行続きのため中身に何も入っていないものが多いですね)

4, リストの空白要素以外をすべて文字列に戻す

text="\n".join(line for line in lines if line)
  • .joinはリストを文字列に変換します。
  • ここで、それぞれのリストの中身ごとに改行して文字列に戻していきます。このとき注意点は、「''」のような中身が何もないlineは無視することです。そのためにif lineが必要です。

以上で完成です。最終アウトプットはこんな感じです。

参考URL