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
--------------------------------------------------------------------------------