質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1475閲覧

BeautifulSoupのスクレイピングで表(テーブル)の中の特定の文字を取得したい

退会済みユーザー

退会済みユーザー

総合スコア0

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/03/02 10:48

前提・実現したいこと

BeautifulSoupのスクレイピングで表の中の特定の文字を取得したい。
取得した文字(作家の名前)をデータベースに登録したい。

テーブルは以下のようなHTMLで構成されています。

HTML

1<div class="tab-content" id="myTabContent"> 2 3 <div id="no9" class="tab-pane fade active in"> 4 <dl> 5 <dt><span class="no">回</span><span class="year">受賞年</span></dt><dd><span class="name">受賞者</span><span class="title head">受賞作</span><span class="magazine ">掲載誌</span></dd> 6 7 <dt><span class="no">160</span><span class="year">2018下</span></dt><dd><span class="name">上田岳弘</span><span class="title">ニムロッド</span><span class="magazine ">群像</span></dd> 8 <dt><span class="no">160</span><span class="year">2018下</span></dt><dd><span class="name">町屋良平</span><span class="title">1R<span class="small">(いちらうんど)</span>1分34秒</span><span class="magazine ">新潮</span></dd> 9 10 11 </dl> 12 </div> 13

発生している問題・エラーメッセージ

<dd>タグ内にある作者の名前だけを抽出したいのですが、最初の<dd>タグにある「受賞者」という文字列も取得されてしまいます。

<span class="name">という指定も同じなので、作家名だけを抜き出すという指定ができずにおります。

試したこと

find_allなどで引数にいろんな条件を指定してみましたが、いかんせんタグの構成やクラスもまったく同じなので何もできませんでした。

最終的に作家名をデーターベースに登録できればいいのですが、他の方法などがあれば合わせてご教授願います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

find_all() の返り値のリストの1個目を tags[1:] として無視すればよいのではないでしょうか。

python

1html = '''<div class="tab-content" id="myTabContent"> 2 <div id="no9" class="tab-pane fade active in"> 3 <dl> 4 <dt><span class="no">回</span><span class="year">受賞年</span></dt> 5 <dd><span class="name">受賞者</span><span class="title head">受賞作</span><span class="magazine ">掲載誌</span></dd> 6 <dt><span class="no">160</span><span class="year">2018下</span></dt> 7 <dd><span class="name">上田岳弘</span><span class="title">ニムロッド</span><span class="magazine ">群像</span></dd> 8 <dt><span class="no">160</span><span class="year">2018下</span></dt> 9 <dd><span class="name">町屋良平</span><span class="title">1R<span class="small">(いちらうんど)</span>1分34秒</span><span class="magazine ">新潮</span></dd> 10 </dl> 11 </div> 12</div>''' 13 14from bs4 import BeautifulSoup 15 16soup = BeautifulSoup(html, 'lxml') 17tags = soup.find_all('span', class_='name')[1:] 18 19names = [t.text for t in tags] 20print(names) # ['上田岳弘', '町屋良平']

投稿2019/03/02 10:57

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/03/02 11:25

やってみたところ抽出できました。ありがとうございます! ちなみに、tags[1:]というのはどういった指定方法なのでしょうか?今後の参考にしたいので、可能であればご教授いただきたいです。 加えて、[t.text for t in tags] というのが for文だというのはわかるのですが、先頭をt.text とすることでどのような式展開になるのでしょうか?
tiitoi

2019/03/02 11:35 編集

tags[1:] はスライスという機能 https://note.nkmk.me/python-slice-usage/ [t.text for t in tags] の [x for x in lst] は内包記法 https://note.nkmk.me/python-list-comprehension/ どちらも Python 言語のとても重要な機能なので、ご存知ない場合はスクレイピングなど実践的なことに取り組む前に言語の基礎を勉強することをおすすめします。 t.text はタグ配下のテキストを取得する attribute です。 <b>test</b> というタグがあったとき、tag が b タグを表しているとすると、print(b.text) # 'test'
退会済みユーザー

退会済みユーザー

2019/03/02 11:42

解説ありがとうございます!とても勉強になりました。 あらためて基礎からやりたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問