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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1946閲覧

Python: BeautifulSoupでの親要素の判定方法について

john_doe_

総合スコア354

Beautiful Soup

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/08/21 19:27

編集2020/08/21 19:32

BeautifulSoupを利用して、下記のようなdom(一部抜粋)からpタグを取得しつつ、
tableタグ内の要素かを判定したいと考えております。

<table><tbody><tr> <td><p></p> </td> <td><p>項目</p> </td> <td><p>対象項目</p> </td> <td><p>担当</p> </td></tr> <tr> <td><p>①</p> </td> <td><p>掃除当番</p> </td> <td><p>教室</p> <p>中庭</p> </td> <td><p>グループA班</p> </td></tr> </tbody></table>
# 親要素を確認するも、<table>とは返ってこず。。。。。 t = soup.find('table') print(t.find_all('p')[0].parent) out: <td><p></p> </td>

下記を参考にしながら検討しましたが、自己解決できずにおります。
https://www.pynote.info/entry/beautiful-soup-access-dom-tree

大変稚拙な質問となり恐縮ではございますが、tableタグ内の要素であることを判定するにはどうしたら良いでしょうか?
ご教示いただけましたら幸甚でございます。
何卒よろしくお願い申し上げます。

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

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

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

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

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

dameo

2020/08/22 06:19

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all 「このfind_all()メソッドは、タグの子孫を調べ、フィルターに一致するすべての子孫を取得します。」 とあるので、 t = soup.find('table')←これはtable要素を探して取得している t.find_all('p')←これは上で見つけたTABLE要素から始めて、その子孫の中のP要素を探して全て取得している つまり、Daregadaさんのおっしゃるとおり、ここで見つかったP要素は全てTABLE要素の子孫にあたります。 out:された内容については、見つかったP要素先頭の親を最終的にprintしてるのですが、P要素の親はTD要素なので、TD要素が表示されています。もしTABLE要素をprintしたいのであれば、今回のHTMLだとP要素の親(TD)の親(TR)の親(TBODY)の親(TABLE)に当たります。 稚拙な質問ではありませんが、理解してから使ってください。
guest

回答1

0

ベストアンサー

提示されたコードでは、table要素の子孫要素からp要素を検索していますから、その時点で見つかるp要素はすべてtable要素に含まれていますよね。改めて親要素や先祖要素からtable要素を探す必要はまったくありません。目的は達成しています。

それを踏まえた上で、「HTMLファイルからすべてのp要素を検索し、その先祖要素にtable要素が含まれているかどうか調べる」必要があるなら、次のように書けばいいかと。

Python

1for p in soup.find_all('p'): 2 if p.find_parents('table'): 3 print(p)

投稿2020/08/21 22:33

編集2020/08/21 23:07
Daregada

総合スコア11990

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

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

john_doe_

2020/08/22 07:13

質問の仕方が悪かったですが、やりたかった処理はご教示いただいた通りです。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問