BeautifulSoupで以下のようにしてxxxxxxを含むimgタグを抽出しています。driverはseleniumです。
html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html, "html.parser") elems = soup.find_all('img', alt=re.compile('xxxxxx'))
しかし、探すべき表のところ以外に余計なところにxxxxxxを含むタグがあるので、検索する範囲を絞りたいです。
なので、そのページの中のとあるセレクタとかX-Path中に含まれるxxxxxxを含むimgタグを抽出することはできるでしょうか?
セレクタかX-Pathの中身を一回抽出して、その中をfind_allする感じにできればいいのですが。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
python
1from bs4 import BeautifulSoup 2html = ''' 3<body> 4 <p class="target">DUMMY1</p> 5 <div id="wrapper"> 6 <p class="target">TARGET1</p> 7 <p class="target">TARGET2</p> 8 </div> 9 <p class="target">DUMMY2</p> 10</body> 11''' 12soup = BeautifulSoup(html, "html.parser") 13wrapper = soup.find('div', id='wrapper') 14target = wrapper.find_all('p', class_='target') 15print(target) 16# [<p class="target">TARGET1</p>, <p class="target">TARGET2</p>]
こんな感じでどうでしょうか。
投稿2020/11/21 00:17
総合スコア204
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/21 01:06
2020/11/21 01:40 編集
2020/11/21 02:51
2020/11/21 18:06
2020/11/21 18:22
2020/11/21 18:39
2020/11/21 19:50
2020/11/22 07:11
2020/11/22 07:37
0
結局soup.selectでセレクター指定でうまくいきました。
セレクターについて、
soup.select('body > table > tbody > tr > td > table:nth-of-type(2) > tbody > tr > td > table:nth-of-type(3) > tbody > tr:nth-of-type(1) > td')
などchromeからCopy Selectorでコピーしてきたセレクタの中のnth-childをnth-of-typeに置き換えたものをBeautifulsoupのセレクタ指定に使っていたのですが、これだとうまくいかなかった。想定と違うところがセレクトされているようだった。
body > table > tbody > tr > td > table:nth-of-type(2) 以下略
のtable:nth-of-type(2) の番号(2)から(1)に変えたら想定していた所がセレクトされるようになりました。
つまり、chromeからCopy Selectorでコピーしてきたセレクタの中のnth-child(2)を単純にnth-of-type(2)に置き換えるだけじゃだめだということですね。
構造自体はちゃんとちゃんと取ってこれてるんだけどnth-childの何番目かという番号はずれることがあるということなんでしょうか。
いちいち、nth-of-typeの何番目になるのか、検証しないといけないというのは不便なんですが……
chromeの目的のセレクターに含まれるnthの番号とbeautirulsoupで指定するセレクターのnth番号の法則とか分かればいいと調べていたら以下のページにたどり着きました。
https://lmn-blog.com/nth-of-type01/
人のページを貼るのもなんなんですが、ここの解説で分かりました。table:nth-child(x)とtable:nth-of-type(x)では、childの方は親構造の下のtable要素と同列のtable以外の要素全てを含む要素の何番目かを指定し、typeではtable要素のみの何番目かという指定になる。
ここで番号がずれる。
Beautifulsoupがnth-childに対応してくれるか、chromeのコピーがnth-of-typeに対応してくれれば、ぱっと指定したセレクターを選択できるのですが、そうでないかぎり検証するか、余計な同列の構造の要素の数を数えるかしないと、想定したところのセレクトが失敗することがある。
勉強になりました。
投稿2020/11/22 07:42
編集2020/11/22 07:48総合スコア78
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
セレクタかX-Pathの中身を一回抽出して、その中をfind_allする感じにできればいいのですが。
まさに、お書きの通り出来ます。
まずある要素を特定して、次にその子孫要素の中だけ検索したいとう事ですよね?
そのまま書けばいいです。
投稿2020/11/21 01:41
総合スコア85901
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/21 08:17
2020/11/22 07:40 編集
2020/11/22 03:02
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。