Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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になってしまう件は解消しました。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away