J'essaie d'extraire des données d'un site Web en utilisant beautifulSoup. Je souhaite extraire des données de cet extrait HTML

<ul class="result-info info-bro-6 cc" style="display: block;">
            <li>
                <strong>MODERATED</strong>
                <ul class="cc">
                        <li>
Health                        </li>
                        <li>
C****                        </li>
                        <li>
C*******                        </li>
                        <li>
D****                        </li>
                        <li>
Di8****                        </li>
                        <li>
Di****                        </li>
                        <li>
F*******                        </li>
                        <li>
Fi******                       </li>
                        <li>
L******                       </li>
                        <li>
M****                        </li>
                        <li>
NM*****                        </li>
                        <li>
P******                        </li>
                        <li>
Pr*****                        </li>
                        <li>
Sp****                        </li>
                        <li>
*******e                        </li>
                </ul>
            </li>

                    <li>
                <strong>
                    *********
                </strong>
                <ul class="cc">
                        <li>***   /****</li>
                </ul>
            </li>
            </ul>

Les données que je veux extraire sont "*** / ****". Je veux que mon code retourne ceci et seulement cela, mais le code que j'ai actuellement renvoie toutes les données dans les balises li. Comment puis-je extraire uniquement les données que je souhaite?

Voici mon code actuel:

from bs4 import BeautifulSoup
import requests

html = """<ul class="result-info info-bro-6 cc" style="display: block;">
            <li>
                <strong>H*******</strong>
                <ul class="cc">
                        <li>
H*****                        </li>
                        <li>
C****                        </li>
                        <li>
C*******                        </li>
                        <li>
D****                        </li>
                        <li>
Di*****                        </li>
                        <li>
Di****                        </li>
                        <li>
F*******                        </li>
                        <li>
Fi******                       </li>
                        <li>
L******                       </li>
                        <li>
M****                        </li>
                        <li>
NM*****                        </li>
                        <li>
P******                        </li>
                        <li>
Pr*****                        </li>
                        <li>
Sp****                        </li>
                        <li>
*******e                        </li>
                </ul>
            </li>

                    <li>
                <strong>
                    *********
                </strong>
                <ul class="cc">
                        <li>***   /****</li>
                </ul>
            </li>
            </ul>"""


soup = BeautifulSoup(html)
for ultag in soup.find_all('ul', {'class': 'cc'}):
    for litag in ultag.find_all('li'):
             print(litag.text)
0
P0w3rshell 13 mars 2019 à 17:54

2 réponses

Meilleure réponse

Comme vous l'avez remarqué, il y a un tas de ul balises avec class=cc. Vous devrez trouver une cohérence dans votre code HTML qui vous permettra de saisir celle-ci et celle-là uniquement.

Par exemple, la balise ul que vous souhaitez est la dernière de votre code HTML. Donc, au lieu de parcourir toutes les balises ul, obtenez simplement la dernière:

ultag = soup.find_all('ul', {'class':'cc'})[-1]
litag = ultag.li
print(litag.text)

Malheureusement, si cela ne fonctionne pas car il y a plus de ul balises plus tard dans votre code HTML, vous devrez rendre votre navigation plus précise.


S'il s'agit du dernier ul de la classe result-info info-bro-6 cc, cela peut peut-être vous aider:

outer_ul = soup.select_one('ul.result-info.info-bro-6.cc')
last_ul = outer_ul.find_all('ul')[-1]
print(last_ul.text)
0
TerryA 13 mars 2019 à 15:11

Vous pouvez utiliser next pour trouver le prochain frère de cette balise

soup = BeautifulSoup(html, 'html.parser')
data = soup.findAll('ul', attrs={'class':'cc'})[2].next.next.text
print(data)
0
Sohan Das 14 mars 2019 à 06:29