1. ホーム
  2. パイソン

[解決済み] beautifulsoup: find_all on bs4.element.ResultSet object or list?

2022-03-03 04:43:50

質問

こんにちは、私は beautifulsoup object で、何かを見つけると、それは bs4.element.ResultSet object または list .

そこでさらにfind_allを行いたいのですが、それは bs4.element.ResultSet object . の各要素をループすることができます。 bs4.element.ResultSet object を使用してfind_allを実行します。しかし、ループを避け、単に beautifulsoup object ?

詳細はコードをご覧ください。ありがとうございます。

html_1 = """
<table>
    <thead>
        <tr class="myClass">
            <th>A</th>
            <th>B</th>
            <th>C</th>
            <th>D</th>
        </tr>
    </thead>
</table>
"""
soup = BeautifulSoup(html_1, 'html.parser')

type(soup) #bs4.BeautifulSoup

# do find_all on beautifulsoup object
th_all = soup.find_all('th')

# the result is of type bs4.element.ResultSet or similarly list
type(th_all) #bs4.element.ResultSet
type(th_all[0:1]) #list

# now I want to further do find_all
th_all.find_all(text='A') #not work

# can I avoid this need of loop?
for th in th_all:
    th.find_all(text='A') #works

解決方法は?

ResultSet クラスは リストのサブクラス であって Tag クラス を持つ find* メソッドが定義されています。の結果をループして find_all() が最も一般的な方法です。

th_all = soup.find_all('th')
result = []
for th in th_all:
    result.extend(th.find_all(text='A'))

通常は CSS セレクタ でできることがすべてではないことを除けば、一度に解決できるかもしれません。 find_all() が可能なのは select() メソッドを使用します。例えば、quot;text" 検索は bs4 CSSセレクタです。しかし、たとえば、すべてを見つけなければならないとしたら、たとえば、次のようになります。 b の中にある th 要素を使えば、できるはずです。

soup.select("th td")