Maison > Questions et réponses > le corps du texte
J'essaie d'utiliser BeautifulSoup pour extraire des informations d'un bloc HTML structuré de manière non uniforme. Je cherche un moyen de combiner des blocs de texte entre les balises dans la sortie de recherche/filtrage. Par exemple, depuis le HTML :
<span> <strong>Description</strong> Section1 <ul> <li>line1</li> <li>line2</li> <li>line3</li> </ul> <strong>Section2</strong> Content2 </span>
Je souhaite créer une liste de sortie qui ignore certains types de balises (ul
和 li
),但捕获顶级未标记文本。我发现的最接近的是 .select(':not(ul,li)')
或 .find_all(['strong'])
dans l'exemple ci-dessus, mais aucune d'entre elles ne peut capturer à la fois le texte de niveau supérieur non balisé et diverses balises cibles. Le comportement idéal serait quelque chose comme ceci :
.find_all(['strong','UNTAGGED'])
produit le résultat suivant :
[ <strong>Description</strong>, Section1, <strong>Section2</strong>, Content2 ]
P粉9051445142023-09-16 00:38:21
Pour obtenir le résultat, vous pouvez d'abord sélectionner ,然后选择它的
next_sibling
.
from bs4 import BeautifulSoup html = ''' <span> <strong>Description</strong> Section1 <ul> <li>line1</li> <li>line2</li> <li>line3</li> </ul> <strong>Section2</strong> Content2 </span> ''' soup = BeautifulSoup(html) data = [] for e in soup.select('strong'): data.extend([e,e.next_sibling.strip()]) data
[<strong>Description</strong>, 'Section1', <strong>Section2</strong>, 'Content2']