Vous pouvez sélectionner tous les nœuds descendants par accéder au .descendants
property.
À partir de là, vous pouvez itérer sur tous les descendants et les filtrer en fonction de la propriété name
. Si le noeud n'a pas de propriété name
, il s'agit probablement d'un noeud de texte que vous souhaitez conserver. Si la propriété est name
a
ou img
, alors vous le garder ainsi.
# This should be the wrapper that you are targeting
container = soup.find('div')
keep = []
for node in container.descendants:
if not node.name or node.name == 'a' or node.name == 'img':
keep.append(node)
Voici une alternative où tous les éléments filtrés sont utilisés pour créer la liste directement:
# This should be the wrapper that you are targeting
container = soup.find('div')
keep = [node for node in container.descendants
if not node.name or node.name == 'a' or node.name == 'img']
Aussi, si vous ne voulez pas les chaînes qui sont vides à renvoyer, vous pouvez couper les espaces et vérifier que ainsi:
keep = [node for node in container.descendants
if (not node.name and len(node.strip())) or
(node.name == 'a' or node.name == 'img')]
Basé sur le HTML que vous avez fourni, ce qui suit seraient renvoyés:
> ['Hello all ', <a href="xx"></a>, <img rscr="xx"/>]
En termes de sécurité est un whitelist mieux! –