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
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")