Home > OS >  Separate different elements after using .find_all in Beautiful Soup
Separate different elements after using .find_all in Beautiful Soup

Time:10-23

I am a bit of an amateur using BeautifulSoup. After running soup.find_all('ul',class_='tags tags--project') in my object of interest I obtain the following output:

<ul >
<li><a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[category_id][]=80" title="Filtrer les résultats de la catégorie : Nature en ville"><span >Filtrer les résultats de la catégorie : Nature en ville</span><span aria-hidden="true">Nature en ville</span></a></li>
<li><a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[scope_id][]=71" title="Filtrer les résultats pour le secteur : 4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux"><span >Filtrer les résultats pour le secteur : 4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux</span><span aria-hidden="true">4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux</span></a></li>
</ul>, <ul >
<li><a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[category_id][]=80" title="Filtrer les résultats de la catégorie : Nature en ville"><span >Filtrer les résultats de la catégorie : Nature en ville</span><span aria-hidden="true">Nature en ville</span></a></li>
<li><a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[scope_id][]=66" title="Filtrer les résultats pour le secteur : 2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie"><span >Filtrer les résultats pour le secteur : 2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie</span><span aria-hidden="true">2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie</span></a></li>
</ul>,........

I am interested in extracting the objects that come after title="...." but I am not sure what is the most efficient way to do so. Since they are inside <li> I tried something like soup.find_all('ul',class_='tags tags--project').find_all('li') but that does not work. Do you have any suggestions?

PS: As you can see from the example above, normally inside each ul you have four title="...." but the second two are just repetitions of technically I just need to keep the first two.

CodePudding user response:

If I understand you correctly you want to get text from the different <span>s under <ul>:

from bs4 import BeautifulSoup

html_doc = """\
<ul >
    <li>
        <a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[category_id][]=80" title="Filtrer les résultats de la catégorie : Nature en ville">
            <span >Filtrer les résultats de la catégorie : Nature en ville</span>
            <span aria-hidden="true">Nature en ville</span>
        </a>
    </li>
    <li>
        <a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[scope_id][]=71" title="Filtrer les résultats pour le secteur : 4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux">
            <span >Filtrer les résultats pour le secteur : 4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux</span>
            <span aria-hidden="true">4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux</span>
        </a>
    </li>
</ul>
<ul >
    <li>
        <a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[category_id][]=80" title="Filtrer les résultats de la catégorie : Nature en ville">
            <span >Filtrer les résultats de la catégorie : Nature en ville</span>
            <span aria-hidden="true">Nature en ville</span>
        </a>
    </li>
    <li>
        <a href="/processes/mes-idees-pour-mon-quartier/f/472/budgets/3/projects?filter[scope_id][]=66" title="Filtrer les résultats pour le secteur : 2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie">
            <span >Filtrer les résultats pour le secteur : 2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie</span>
            <span aria-hidden="true">2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie</span>
        </a>
    </li>
</ul>"""


soup = BeautifulSoup(html_doc, "html.parser")

for ul in soup.select("ul.tags.tags--project"):
    for span in ul.select("span"):
        print(span.text)
    print("-" * 80)

Prints:

Filtrer les résultats de la catégorie : Nature en ville
Nature en ville
Filtrer les résultats pour le secteur : 4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux
4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux
--------------------------------------------------------------------------------
Filtrer les résultats de la catégorie : Nature en ville
Nature en ville
Filtrer les résultats pour le secteur : 2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie
2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie
--------------------------------------------------------------------------------

If you want every second one, you can use [::2]:

for ul in soup.select("ul.tags.tags--project"):
    for span in ul.select("span")[::2]:     # <-- use [::2] here
        print(span.text)
    print("-" * 80)

Prints:

Filtrer les résultats de la catégorie : Nature en ville
Filtrer les résultats pour le secteur : 4.2 - Jolimont / Soupetard / Roseraie / Gloire / Gramont / Amouroux
--------------------------------------------------------------------------------
Filtrer les résultats de la catégorie : Nature en ville
Filtrer les résultats pour le secteur : 2.4 - Casselardit / Fontaine-Bayonne / Cartoucherie
--------------------------------------------------------------------------------
  • Related