recherche

Maison  >  Questions et réponses  >  le corps du texte

BeautifulSoup : combiner du texte de niveau supérieur avec la fonctionnalité de recherche de balises classique ?

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 (ulli),但捕获顶级未标记文本。我发现的最接近的是 .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粉471207302P粉471207302438 Il y a quelques jours520

répondre à tous(1)je répondrai

  • P粉905144514

    P粉9051445142023-09-16 00:38:21

    Pour obtenir le résultat, vous pouvez d'abord sélectionner ,然后选择它的next_sibling.

    Exemple
    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
    Sortie
    [<strong>Description</strong>,
     'Section1',
     <strong>Section2</strong>,
     'Content2']

    répondre
    0
  • Annulerrépondre