Utilisez zip
.
À partir de la liste d'articles sur un site, utilisez BeautifulSoup4
pour obtenir une liste d'URL et de titres.
Le but est de créer une liste de ['url >>> title', 'url >>> title']
qui relie l'URL et le titre avec > >>
.
Si la page a un titre dans l'élément de balise a comme indiqué ci-dessous ...
import requests, bs4
res = requests.get('https://qiita.com/takuto_neko_like')
posts = bs4.BeautifulSoup(res.text, 'html.parser').select('.u-link-no-underline')
print(posts)
La variable posts
contient <class'bs4.element.Tag '>
, et vous pouvez voir le contenu de la balise a de html en y accédant individuellement en tant que posts [0].
Le titre est décrit dans l'élément de la balise a
[<a class="u-link-no-underline" href="/takuto_neko_like/items/52c6c52385386544aa62">Où j'étais inquiet pour heroku</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/c5791f267e0964e09d03">J'ai créé un outil pour obtenir de nouveaux articles</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/93b3751984e5e3fd3670">le poisson se déplaçait trop lentement git problème</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/62aeb4271614f6f0347f">Utiliser des graphiques créés avec Plotly avec Django</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/c9c80ff453d0c4fad239">【Python】super()Raisons de passer outre</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/14e92797fa2b23a64adb">[Python] Qu'est-ce qui est hérité par l'héritage multiple?</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/6cf9bade3d9515a724c0">【Python】@Que sont les méthodes de classe et les décorateurs?</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/aed9dd5619d8457d4894">【Python】*args **Qu'est-ce que kwrgs</a>, <a class="u-link-no-underline" href="/takuto_neko_like/items/bb8d0957347636b5bf4f">[Bootstrap] Comment réparer et afficher la barre de navigation même si vous faites défiler, points à garder à l'esprit et solutions</a>]
Le contenu de chaque balise est <class'bs4.element.Tag '>
= objet Tag, donc en le convertissant en type chaîne avec str (), vous pouvez utiliser .find ()
avec le `nom de la balise et les attributs. En utilisant l'index obtenu en spécifiant le nom, etc., il sera possible d'extraire uniquement les chaînes de caractères de la partie URL et de la partie titre.
Mettre en forme l'URL et le titre
for post in posts:
#Extraire l'URL
index_first = int(str(post).find('href=')) + 6
index_end = int(str(post).find('">'))
url = (str(post)[index_first : index_end])
#Extrait du titre
index_first = int(str(post).find('">')) + 2
index_end = int(str(post).find('</a'))
title = (str(post)[index_first : index_end].replace('\u3000', ' '))
url_title_set.append(f"{url}>>>{title}")
Si oui, c'est fait.
Cependant, de nombreux sites de type ** n'ont pas de titre répertorié comme élément de la balise ** a. Par exemple, un modèle dans lequel les informations sur l'article sont affichées sous la forme d'une carte constituée d'une image et d'un titre, et un lien est attaché à la carte entière.
Exemple
<div class='card'><a href='#' class='link'>
<div class='image'><img src='#'></div>
<div class='title'>Titre</div>
</a>
</div>
Dans un tel cas, vous pouvez accéder à la balise div à laquelle la classe de carte est appliquée en spécifiant la classe card
in .select
de bs4. Je veux obtenir les informations href de la balise a et l'élément de la classe de titre div à partir de là.
Dans le code actuel, il y a plus d'éléments qui se chevauchent, donc essayer de trouver une chaîne spécifique dans .find à partir de l'élément parent peut être un peu ennuyeux.
De plus, bs4 a un moyen d'accéder aux éléments enfants, mais cela m'a semblé un peu ennuyeux quand j'ai regardé la documentation, donc j'ai obtenu chacun d'eux individuellement comme suit.
posts_links = bs4.BeautifulSoup(res.text, 'html.parser').select('.link')
posts_titles = bs4.BeautifulSoup(res.text, 'html.parser').select('.title')
Nous accèderons à l'objet Tag individuellement en tournant la liste des articles avec l'instruction for en formatant le code précédent ʻurl et title
, mais cette fois il y a deux listes. Tournez deux listes en même temps avec une instruction for et combinez l'url et le titre obtenus à partir de chaque liste. Ensuite, je veux le stocker dans une nouvelle liste.
De cette façon, si vous voulez faire pivoter plusieurs listes avec une instruction for en même temps, utilisez zip
.
now_posts_link_title_set = []
for (posts_link, posts_title) in zip(posts_links, posts_titles):
index_first = int(str(posts_link).find('href=')) + 6
index_end = int(str(posts_link).find('">'))
posts_link_set = (str(posts_link)[index_first : index_end])
index_first = int(str(posts_title).find('h2')) + 3
index_end = int(str(posts_title).find('</h2'))
posts_title_set = (str(posts_title)[index_first : index_end].replace('\u3000', ' ')) #Remplacement du blanc
now_posts_link_title_set.append(f"{posts_link_set}>>>{posts_title_set}")
C'est normal d'en avoir plus de deux
for (a, b, c, d) in zip(a_list, b_list, c_list, d_list)
S'il y a une différence dans le nombre d'éléments dans la liste, le plus grand sera ignoré
aa = [1,2,3,4,5]
bb = ['a', 'b', 'c']
for (a, b) in zip(aa, bb):
print(f'{a} : {b}')
#résultat
1 : a
2 : b
3 : c
C'est pratique
Recommended Posts