なろう分析記録

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

【Pythonスクレイピング】 BeautifulSoupのCSSセレクタで『特定のTD・TRタグ要素』を抜き出す方法

BeautifulSoupのCSSセレクタは便利

Pythonスクレイピングするときに第一選択となるのが「BeautifulSoup」

BeautifulSoupを使えばCSSの特定の要素だけを抜き出すことが簡単にできます。
しかし、webページによくある”表”の中の特定の要素だけを抜き出したい場合は少し工夫が必要となります。


idが付いている場合は簡単

抽出したいtd trタグにidが付いている場合は非常に簡単です。
そのidを指定して抜き出す方法として以下の方法があります。

soup_find(class_="aaaaa")
#先頭の1つだけ取得

soup.find_all(class_="aaaa")
#ページ内の全てを取得

この方法を使えばそのclassが付いたタグを拾ってこれます。

classが付いていない場合は『順番』で指定する

しかし多くのwebページのテーブルタグのtr tdタグにはidが付与されていません。

以下の様なページの場合です。

<table class="noveltable2">
    <tbody>
        <tr>
            <th>掲載日</th>
            <td>2019年 05月04日 10時09分</td>
        </tr>
        <tr>
            <th>最新部分掲載日</th>
            <td>2019年 05月09日 12時00分</td>
        </tr>
        <tr>
            <th>感想</th>
            <td>201件</td>
        </tr>
    </tbody>
</table>

この様なページで「201件」の所だけ抜き出したい時は、

soup.find_all("td") [3]
#<td>201件</td>

の様にします。

[3]の数字を変更することで特定のセルだけを狙って、ピンポイントに表からデータを抽出できます。

サンプルコード

# td要素取得
import requests
from bs4 import BeautifulSoup

# URLの指定        
url = 'https://ncode.syosetu.com/novelview/infotop/ncode/n2919fm/'

#ユーザーエージェントの設定(設定必須)
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"}

# URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます
response = requests.get(url=url, headers=headers)
html = response.content

# 感想件数取得 instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします
soup = BeautifulSoup(html, "html.parser")
sp = soup.find_all('td') [6]

print(sp)

#<td>
#7件
#
#<br/><span class="uketuke">※ログイン必須</span>
#</td>
TIPs:後ろから数えることも可能
soup.find_all("td") [-1]
#<td>201件</td>

「-1」を使えば該当するTDタグの中で後ろから数えることも可能です。
全体の数が表によって変動する様な場合には、この後ろから数える方法を使うのも一つの手です。

もし該当のTDがない場合にpassする処理

該当のタグが存在しない場合はNoneが帰ってきます。
なのでif文で対応できます。

if len(soup.find_all("td") )==0:
  printsoup.find_all("td") [-1])
else:
  pass: