web-dev-qa-db-fra.com

beautifulsoup: find_all sur bs4.element.ResultSet objet ou liste?

Salut, j'applique find_all sur un beautifulsoup object, et trouver quelque chose, qui est un bs4.element.ResultSet object ou list.

Je veux continuer à trouver_tout, mais ce n'est pas autorisé sur un bs4.element.ResultSet object. Je peux parcourir chaque élément du bs4.element.ResultSet object pour trouver find_all. Mais puis-je éviter de boucler et simplement le reconvertir en beautifulsoup object?

Voir le code pour plus de détails s'il vous plaît. Merci

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
13
YJZ

ResultSet class est une sous-classe d'une liste et non une Tag class qui a les méthodes find* définies. Parcourir les résultats de find_all() est l'approche la plus courante:

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

Habituellement, sélecteurs CSS peut vous aider à le résoudre en une seule fois, sauf que tout ce que vous pouvez faire avec find_all() n'est pas possible avec la méthode select(). Par exemple, aucune recherche de "texte" n'est disponible dans les sélecteurs CSS bs4. Mais si, par exemple, vous deviez trouver tous, disons, les éléments b à l'intérieur des éléments th, vous pourriez faire:

soup.select("th td")
17
alecxe