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

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

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

448閲覧

Python3のBeautifulSoupでのスクレイピングで親要素のclass名が被っている時任意の値を取りたい

退会済みユーザー

退会済みユーザー

総合スコア0

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/02/10 11:26

編集2020/02/10 14:11

前提・実現したいこと

python3にて、BeautifulSoupを使ってのスクレイピングを練習をしており、取得したい値のclass名が他の値のclass名とバッティングしてしまい、欲しい値がとれないので質問させていただきます。

以下のソースコードの'かかか'を取得したいのですが、いくら調べても取得できません...。

どなたかご教授よろしくお願い致します。

該当のソースコード

html

1<tr> 2 <td class='aaa'> 3 <div class='bbb'>あああ</div> 4 <div class='ccc'>いいい</div> 5 </td> 6 7 <td class='aaa'>ううう</td> 8 9 <td class='aaa'> 10 <div class='ddd'>えええ</div> 11 <div class='eee'>おおお</div> 12 </td> 13 14 <td class='aaa'>かかか</td> 15</tr>

試したこと

hoge = soup.find_all('td', class_='aaa')
for i in hoge:
----print(i.text[1])

補足情報(FW/ツールのバージョンなど)

Python3.7.4

追記

ご指摘を頂きましたので追記させていただきます。

'ううう'は取得せず、'かかか'のみを取得したいという認識です。

質問文のソースコードはとあるサイトの1つの商品情報を記載している欄を抜粋したものでして、'かかか'の文字列はあくまで例でこの文字列は商品によって変化します。

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

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

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

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

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

can110

2020/02/10 13:08

取得ルールがいまひとつ分かりませんので、提示くださると回答得られやすいと思います。 たとえば「ううう」は取得されない(したくない)でよいのでしょうか。
退会済みユーザー

退会済みユーザー

2020/02/10 13:13

情報不足申し訳ございません。 'ううう'は取得せず、'かかか'のみを取得したいという認識です。よろしくお願い致します。
can110

2020/02/10 13:17

どのようなルールで'ううう'は取得せず、'かかか'のみが取得されるのかが不明ですので説明願えますか? 単純に「かかか」という文字列と一致するか?というルールでよければそのような回答がついていますが。
退会済みユーザー

退会済みユーザー

2020/02/10 14:09

これも説明不足ですいません。質問文のソースコードはとあるサイトの1つの商品情報を記載している欄を抜粋したものでして、'かかか'の文字列はあくまで例でこの文字列は商品によって変化します。
quickquip

2020/02/10 14:51

'ううう'と’かかか'をどうやったら区別できるのか? を言語化できない限り、回答を得ることも、プログラムを組むこともできません。 中にテキストだけを持つtd.aaaを取得した時の2番目 とか 「div.dddを含むtd.aaa」の直後の「中にテキストだけを持つtd.aaa」 とか 『「div.dddを含むtd.aaa」の直後の「中にテキストだけを持つtd.aaa」』以外の「中にテキストだけを持つtd.aaa」 とか です。 また、質問で"あああ","いいい",”ううう","えええ"と抽象的になっていてこのデータがなんなのかが想像できないことが回答を難しくしています。
guest

回答4

0

「タグtdクラスaaa直下にあるテキストのみを取得したい」というのであれば、以下のような感じでよいかと思います。

Python

1from bs4 import BeautifulSoup 2import bs4 3 4s = """ 5<tr> 6 <td class='aaa'> 7 <div class='bbb'>あああ</div> 8 <div class='ccc'>いいい</div> 9 </td> 10 11 <td class='aaa'>ううう</td> 12 13 <td class='aaa'> 14 <div class='ddd'>えええ</div> 15 <div class='eee'>おおお</div> 16 </td> 17 18 <td class='aaa'>かかか</td> 19</tr>""" 20 21# (もし不要であれば)タグ前後の空白、改行を取り除く 22s = ''.join([line.strip() for line in s.split('\n')]) 23 24soup = BeautifulSoup(s, 'html.parser') 25 26ret = [] 27hoge = soup.find_all('td', class_='aaa') 28for i in hoge: 29 # 直下に存在する文字列のみ抽出 30 for c in i.children: 31 if isinstance( c, bs4.element.NavigableString): 32 ret.append(c) 33 34print(ret) # ['ううう', 'かかか']

投稿2020/02/10 13:12

can110

総合スコア38262

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

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

0

ベストアンサー

さらに試行錯誤した所、自己解決できました。皆様回答してくださりありがとうございました。

python

1from bs4 import BeautifulSoup 2import bs4 3 4url = """ 5<tr> 6 <td class='aaa'> 7 <div class='bbb'>あああ</div> 8 <div class='ccc'>いいい</div> 9 </td> 10 11 <td class='aaa'>ううう</td> 12 13 <td class='aaa'> 14 <div class='ddd'>えええ</div> 15 <div class='eee'>おおお</div> 16 </td> 17 18 <td class='aaa'>かかか</td> 19</tr> 20""" 21 22soup = BeautifulSoup(url, 'lxml', from_encoding='utf-8') 23hoge = soup.find_all('td', class_='aaa')[3] 24for i in hoge: 25 print(i) 26#>>> かかか 27

投稿2020/02/10 23:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ikapy

2020/02/11 00:18

この回答(自己解決)なら、barobaro様に高評価を与えるべきでは!
barobaro

2020/02/11 10:59

ikapyさんありがとうございます 何がしたいのかよくわかりませんね
guest

0

stringで文字指定できます

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#id12

正規表現にして使うのが一般的かと思います

python

1from bs4 import BeautifulSoup 2 3html = """ 4<tr> 5 <td class='aaa'> 6 <div class='bbb'>あああ</div> 7 <div class='ccc'>いいい</div> 8 </td> 9 10 <td class='aaa'>ううう</td> 11 12 <td class='aaa'> 13 <div class='ddd'>えええ</div> 14 <div class='eee'>おおお</div> 15 </td> 16 17 <td class='aaa'>かかか</td> 18</tr> 19""" 20 21soup = BeautifulSoup(html, "html.parser") 22 23soup.find_all('td', class_='aaa', string="かかか")

あと思いつくのは

python

1soup.find('td', class_='aaa', string="かかか") 2 3soup.find_all('td', class_='aaa')[3] 4 5soup.select_one("td:nth-of-type(4)") 6 7soup.select("td.aaa")[3]

直下の場合はrecursive=Falseで再帰なしにしてif i.stringでフィルタしたのでもいいかもしれません

python

1result = [i.string for i in soup.tr.find_all('td', class_='aaa', recursive=False) if i.string]

投稿2020/02/10 12:59

編集2020/02/10 14:05
barobaro

総合スコア1286

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

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

0

こんなん(.textを使うこと)でいいのかな?

python

1from bs4 import BeautifulSoup 2import io 3html = """ 4<tr> 5 <td class='aaa'> 6 <div class='bbb'>あああ</div> 7 <div class='ccc'>いいい</div> 8 </td> 9 10 <td class='aaa'>ううう</td> 11 12 <td class='aaa'> 13 <div class='ddd'>えええ</div> 14 <div class='eee'>おおお</div> 15 </td> 16 17 <td class='aaa'>かかか</td> 18</tr> 19""" 20 21f_soup = io.StringIO(html) 22soup = BeautifulSoup(f_soup, "html.parser") 23elems = soup.find_all('td', class_='aaa') 24for elem in elems: 25 if elem.text == "かかか": 26 print("かかか")

投稿2020/02/10 12:16

ikapy

総合スコア1167

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問