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

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

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

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

Q&A

2回答

192閲覧

特定の単語をスクレイピングする方法

chitokaku

総合スコア13

Python

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

0グッド

0クリップ

投稿2019/04/16 13:54

html

1コード 2<th>メニュー</th> 3<td id="shop-data-menu"> 4<br /> 5〇〇カレー 800円<br /> 6〇〇うどん 600円<br /> 7〇〇そば  800円<br /> 8〇〇大盛  +100円<br /> 91011

ここからカレーを含むbrタグのみをスクレイピングしたいとき

python

1コード 2 # メニュー 3 menu = bs.findAll('td', id_="shop-data-menu") 4 for c in menu 5 if "カレー" in c.get('br') 6

でうまくいかないのですが、ほかに方法はありますでしょうか。

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

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

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

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

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

guest

回答2

0

上手くいかない

とは、具体的にどういう動作を想定し、どうなったから「上手くいかない」と判断されたのでしょうか?

カレーを含むbrタグ

は存在しません。brタグは<br />で完結しています。tdタグのinnerHTMLを取得し<br />区切りで切り出さないと取れないと思います。

投稿2019/04/16 14:01

Y.H.

総合スコア7914

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

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

chitokaku

2019/04/17 01:25

回答ありがとうございます。 想定していた動作は"〇〇カレー 800円"という文字列のみが抽出される動作です。 AttributeError: 'NavigableString' object has no attribute 'get' というエラーがif文に出てしまいました。 <br />区切りで切り出すにはどう書けばよろしいでしょうか。
Y.H.

2019/04/17 01:46

ここに詳細記載をされても目につきにくいので、 質問を編集し追記しましょう。 > <br />区切りで切り出す 単なる文字列処理なのでご自分で考えてみましょう。 ちなみに、「どう書けばよろしいでしょうか」というのは単にやってほしいことを丸投げしているだけなので止めましょう。
guest

0

あるタグの1つ前の要素は previous_sibling 属性で取得できるので、それが文字列 (NavigableString) かどうか判定して、そうである場合はリストに詰めていけばよいでしょう。

python

1html = '''<th>メニュー</th> 2<td id="shop-data-menu"> 3<br /> 4カレー 800円<br /> 5うどん 600円<br /> 6そば 800円<br /> 7大盛 +100円<br />''' 8 9from bs4 import BeautifulSoup, NavigableString 10 11soup = BeautifulSoup(html) 12 13lst = [] 14for br in soup.select('td#shop-data-menu br'): 15 prev = br.previous_sibling 16 prev_text = prev.string.replace('\n', '') if isinstance(prev, NavigableString) else None 17 18 if prev_text: 19 # 文字列が空または None でない場合は追加 20 lst.append(prev_text) 21print(lst) # ['カレー 800円', 'うどん 600円', 'そば 800円', '大盛 +100円'] 22

投稿2019/04/17 05:04

tiitoi

総合スコア21956

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問