なろう分析記録

『小説家になろう』をふくめ『ネット小説投稿サイト』を分析する。コード置き場,主にPython,javascript,たまに創作。

【Pythonサンプルコード】スクレイピングで「特定の文字列を含む行」だけを抽出したい時の簡単な方法を解説

「特定の文字列を含む行」だけを抽出したい

Pythonスクレイピングで特定の場所にあるテキストを抽出するとき、「タグ」や「class_」や「id」などで場所を指定するのが一般的です。

ただそれ以外の方法としてテキストを指定して抽出する方法もあるので、ご紹介したいと思います。

f:id:karupoimou:20190708111033p:plain:w400

サンプルコード

import re
import requests
from bs4 import BeautifulSoup

#BeautifulSoupの設定
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"}
url="https://syosetu.com/syuppan/view/bookid/3387/"
response = requests.get(url=url, headers=headers)
html = response.content
soup = BeautifulSoup(html, "lxml")

#ここで「書籍情報」内のテキストを全取得
all_text=soup.find(class_="book_contentinfo").text

#ここで取得したテキストを1行ずつ分割してリストに収納
all_text_list=all_text.split("\n")

#リストを1行ずづ読み込んで部分一致する行だけ抽出
for text in all_text_list:
    if "出版社" in text:
        print(text)

f:id:karupoimou:20190708111324p:plain
結果

解説

all_text=soup.find(class_="book_contentinfo").text

の部分で、book_contentinfoにクラス指定されているタグに挟まれているテキスト全体を取得しています。

all_text_list=all_text.split("\n")

ここで「split」を使って、テキストを改行(\n)ごとに分け、リストに入れています。

f:id:karupoimou:20190708111708p:plain
テキストを分割化したリスト

参考ページ

【Python入門】split関数で文字列の分割の仕方 - Qiita

for text in all_text_list:
   if "出版社" in text:
       print(text)

ここではリストを1行ずつ読み込んで、部分一致する行だけprintしています。

このprintの部分をリストなり他の変数なりに変更することで、特定の文字列を含む行のデータだけを取得することが可能となります。