Transformez plusieurs listes avec l'instruction for en même temps en Python

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

Transformez plusieurs listes avec l'instruction for en même temps en Python
Traiter plusieurs listes avec for en Python
python Remarque: enumerate () -Obtenir l'index et l'élément de la liste en même temps et tourner pour l'instruction
Comment définir plusieurs variables dans une instruction Python for
Tourner un tableau de chaînes avec une instruction for (Python3)
Changer la liste dans l'instruction for
[Introduction à Python] Comment utiliser l'opérateur in dans l'instruction for?
MongoDB avec Python pour la première fois
[Introduction à Udemy Python3 + Application] 47. Traitez le dictionnaire avec une instruction for
Obtenez une instance datetime à tout moment de la journée en Python
Une note utile lors de l'utilisation de Python après une longue période
Configurer un serveur qui traite plusieurs connexions en même temps
Tracez plusieurs cartes et données en même temps avec matplotlib de Python
Utilisez Logger avec Python pour le moment
Boucle les variables en même temps dans le modèle
Comptez le nombre de fois que deux valeurs apparaissent simultanément dans un élément de type itérateur Python 3
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Exécutez avec CentOS7 + Apache2.4 + Python3.6 pour le moment
Enregistrer une tâche dans cron pour la première fois
Automatisez la suppression de l'arrière-plan pour les derniers portraits dans un répertoire avec Python et API
Créer un compte enfant de connect with Stripe en Python
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Créez un Twitter BOT avec le SDK GoogleAppEngine pour Python
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ②
J'ai essayé la même analyse de données avec kaggle notebook (python) et PowerBI en même temps ①
Comment activer l'instruction for lorsqu'il existe plusieurs valeurs pour une clé dans le dictionnaire
[Python] Qu'est-ce qu'une instruction with?
Voir python pour la première fois
[Python 3.8 ~] Réécrire des tableaux etc. en même temps que la définition [astuces]
Créez un sélecteur de couleurs pour la roue chromatique avec Python + Qt (PySide)
L'histoire de la création d'un pilote standard pour db avec python.
Une fonction qui mesure le temps de traitement d'une méthode en python
Lisez le fichier en Python avec un chemin relatif depuis le programme
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Parcourir .loc et .iloc en même temps dans pandas DataFrame
Résolvez les problèmes de somme partielle avec une recherche complète en Python
Jetez un œil à l'arborescence des exceptions intégrée dans Python 3.8.2
Essayez d'utiliser FireBase Cloud Firestore avec Python pour le moment
Mettre le processus en veille pendant un certain temps (secondes) ou plus en Python
Ce que j'ai appris en écrivant une Pull Request Python pour la première fois de ma vie
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Un mémo organisé en renommant les noms de fichiers dans le dossier avec python
Ecrire le test dans la docstring python
Conseils pour gérer les binaires en Python
Comment obtenir la différence de date et d'heure en secondes avec Python
Afficher Python 3 dans le navigateur avec MAMP
Rechercher le labyrinthe avec l'algorithme python A *
Lire le fichier Python # .txt pour Python super débutant super débutant avec travail .py
Exécuter l'interpréteur Python dans le script
Appelez le débogueur python à tout moment
Obtenez et convertissez l'heure actuelle dans le fuseau horaire local du système avec python
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Créer un enregistrement avec des pièces jointes dans KINTONE à l'aide du module de requêtes Python
Comment lire des entrées standard ou des fichiers variables en même temps comme la commande coller en Python
[Python] Comment ouvrir deux fichiers ou plus en même temps
Utilisez autre chose qu'une chaîne <br> pour la clé <br> dict en Python
Essayez le traitement d'image avec Python lorsque vous êtes invité à vous divertir lors d'un mariage