Python
Python3
BeautifulSoup
beautifulsoup4

Beautiful Soupで.stringを使うとNoneになってしまう時の解消法

BeautifulSoupの.stringを利用してタグ内のデータを表示しようとするとNoneが返ってきてしまう時の解消法です。

filename.py
from bs4 import BeautifulSoup

table = '\
  <table>\
    <tr>\
      <td>2018/01/29<br/>18:55</td>\
      <td>晴れ</td>\
    </tr>\
    <tr>\
      <td>2018/01/28<br/>18:45</td>\
      <td>曇り</td>\
    </tr>\
  </table>'

bsObj = BeautifulSoup(table, 'lxml')

tr = bsObj.find_all('tr')

for r in tr:
  td = r.find_all('td')
  for d in td:
    print(d)

# <td>2018/01/29<br/>18:55</td>
# <td>晴れ</td>
# <td>2018/01/28<br/>18:45</td>
# <td>曇り</td>

こんなデータを取得した場合、タグを除去してデータを保管したいところですよね。
.stringを利用してタグの中のテキストだけ取得しようとするとこんな結果が返ってきます。

filename.py
for r in tr:
  td = r.find_all('td')
  for d in td:
    print(d.string)

# None
# 晴れ
# None
# 曇り

2つ以上のタグがある場合は.stringするとNoneが返ってきてしまうようです。
この場合は、.textを利用するとうまくいくようです。

filename.py

for r in tr:
  td = r.find_all('td')
  for d in td:
    print(d.text)

# 2018/01/2918:55
# 晴れ
# 2018/01/2818:45
# 曇り


タグが消されてしまっただけなので今回の例では
年月日と時間を切り分けなければなりませんが、、、
.stringでNoneになってしまう件は解消しました。