[PYTHON] Comment rechercher des données HTML à l'aide de Beautiful Soup

1. Aperçu

J'ai intégré diverses informations de balises dans HTML pour l'analyse des données et j'ai essayé diverses méthodes pour voir si «si les données intégrées sont affichées correctement» peut être détecté par un test automatique.

Parmi eux, j'ai pu rechercher les données HTML cibles en utilisant BeautifulSoup de Python, je vais donc résumer la méthode. ** * Ce cas n'est qu'une méthode de recherche et ne décrit pas l'analyse. ** **

2. Concept de méthode de recherche

Pour obtenir les données HTML cibles avec BeautifulSoup, recherchez d'abord les données entre <> comme point de départ. Ensuite, les données HTML sont recherchées en décrivant les informations contenues dans la balise de départ une par une.

image.png

Si vous spécifiez des données qui doivent être le point de départ avec une valeur unique, il vous suffit de spécifier cet élément, ce qui simplifie la description du programme de recherche.

De plus, afin d'exploiter les exemples de phrases à partir du chapitre 3, on suppose que les programmes suivants sont décrits.


import requests
import re
from bs4 import BeautifulSoup

res = requests.get('Décrivez l'URL à analyser ici')
c=res.content
soup = BeautifulSoup(c,'html.parser')

#Un exemple de phrase est décrit ici

print(elems)

3. 3. Méthode d'acquisition de données de base

Utilisez find s'il n'y a qu'une seule donnée que vous souhaitez acquérir et find_all s'il y a plusieurs données (il existe une autre méthode appelée select, mais cette fois elle est exclue). Find_all est utilisé dans les exemples de phrases suivants.

・ Modèle pour spécifier directement les tags

#Structure de la balise que vous souhaitez rechercher
<script>~</script>
elems = soup.find_all("script")

Il est utilisé lors de la recherche de la pièce entourée de balises simples.

-Modèle pour spécifier plusieurs balises (en utilisant une liste)

#Structure de la balise que vous souhaitez rechercher
<h1>~</h1>
<div>~</div>
elems = soup.find_all(["h1","div"])

Utilisez cette option lorsque vous souhaitez rechercher plusieurs données entre des balises.

・ Modèle pour spécifier des mots-clés (correspondance exacte)

#Structure de la balise que vous souhaitez rechercher
<a class = "test">~</a>
elems = soup.find_all(class_="test")

S'il y a un élément dans lequel une valeur est attribuée en utilisant "=" dans chaque balise, utilisez-le. De plus, lors de la spécification d'une classe, elle doit être "class_". (Parce que la classe est utilisée comme un mot réservé en Python) Si vous avez deux éléments de recherche, utilisez [] comme indiqué ci-dessous.

elems = soup.find_all(id=["test1", "test2"])

・ Modèle pour spécifier des mots-clés (correspondance partielle)

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html">~<a>
elems = soup.find_all(href=re.compile("http://"))

Il est utilisé lors de la recherche partielle de la valeur attribuée par "=".

-Modèle pour spécifier des mots-clés (correspondance exacte en utilisant l'attribut attrs)

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html">~<a>
elems = soup.find_all(attrs={"href":"http://○○/△△.html"})

Utilisez "attrs" lorsqu'il y a quelque chose qui ne peut pas être utilisé comme mot clé, comme la balise de données HTML5.

#Exemple)
× elems = soup.find_all("meta",name="test")
⇒TypeError: find_all() got multiple values for argument 'name'

○ elems = soup.find_all("meta",attrs={"name":"test"})

-Modèle pour vérifier la présence ou l'absence d'éléments (True s'il y a une valeur, False sinon)

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html">~<a>
elems = soup.find_all(href=True)

Tout peut être utilisé dans des balises telles que href, alors utilisez-le lors de la vérification des valeurs. S'il n'y a pas de valeur, spécifiez False comme suit

elems = soup.find_all(id=False)

-Modèle pour rechercher le texte inclus dans les balises (correspondance exacte)

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html">Mode d'emploi<a> #ここのMode d'emploiのみ検索したい
elems = soup.find_all(text='Mode d'emploi')

Utilisez cette option lorsque vous souhaitez extraire uniquement le texte entouré de balises.

-Modèle de recherche de texte inclus dans les balises (correspondance partielle)

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html">Mode d'emploi<a> #ここのMode d'emploiのみ検索したい
elems = soup.find_all(text=re.compile("Aller"))

Utilisez cette option lorsque vous souhaitez extraire uniquement le texte entouré de balises. Ce n'est pas une correspondance exacte, mais une correspondance partielle.

-Motif qui spécifie le nombre de balises à collecter (seul find_all peut être utilisé)

#Structure de la balise que vous souhaitez rechercher
<p>test1</p> #Je veux arriver seulement ici
<p>test2</p>
elems = soup.find_all('p', limit=1)

Utilisez cette option lorsque vous souhaitez obtenir le nombre spécifié à partir de plusieurs balises.

Quatre. Version avancée

Pour trouver les données structurelles spécifiées, ** utilisez souvent une combinaison des modèles de base ci-dessus **.

・ Spécifiez les balises et les mots-clés

#Structure de la balise que vous souhaitez rechercher
<meta name="test">
elems = soup.find_all("meta",attrs={"name":"test"})

Il est utilisé lors de la recherche d'une balise qui a name = test dans la balise appelée meta.

-Spécifier les balises et le texte

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html">C'est un test<a>
elems = soup.find_all("a",text="C'est un test")

Lors de la recherche d'une balise contenant la phrase textuelle "C'est un test" dans la balise a

-Spécifier plusieurs éléments avec attrs

#Structure de la balise que vous souhaitez rechercher
<a href="http://○○/△△.html" title="test">C'est un test</a>
elems = soup.find_all(attrs={"title":"test","href":"http://○○/△△.html"})

・ Spécifiez les balises avant et après le point de départ

De plus, si les données structurelles spécifiées ne peuvent pas être recherchées car il existe plusieurs balises similaires, ** déterminez les données structurelles de départ et effectuez une recherche avant et après ces données. ** Utilisez "next_element" et "previous_element" pour rechercher avant et après. (Next_element est utilisé pour rechercher le dernier élément, previous_element est utilisé pour rechercher l'élément précédent)

#Structure de la balise que vous souhaitez rechercher
<ui>
 <li>
  <a href="http://○○/△△.html">test</a>
 </li>
</ui>

#Je veux l'avoir ici
<ui>
 <li>
  <a href="http://□□/☆☆.html">test2</a> #Obtenez des données d'ici
 </li>
</ui>
elems = soup.find_all("a",href="http://□□/☆☆.html")
elems2 = elems[0].previous_element.previous_element #.previous_Utilisez l'élément deux fois,<ui><li>Pour inclure jusqu'à

-Créer et spécifier une fonction

Vous pouvez également créer des fonctions pour récupérer des données à partir de structures de balises complexes.

#Structure de la balise que vous souhaitez rechercher
<a class="test">~</a> #Je veux arriver seulement ici
<a id="test">~</a>
def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')

elems = soup.find_all(has_class_but_no_id)

Recommended Posts

Comment rechercher des données HTML à l'aide de Beautiful Soup
Comment obtenir des données d'article à l'aide de l'API Qiita
[Python] Comment récupérer un fichier html local et le générer au format CSV à l'aide de Beautiful Soup
Comment utiliser la recherche triée
Comment gérer les trames de données
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
Comment ajouter de nouvelles données (lignes droites et tracés) à l'aide de matplotlib
Comment installer Python à l'aide d'Anaconda
Un mémorandum lors de l'utilisation d'une belle soupe
[Python] Comment FFT des données mp3
Comment lire les données de la sous-région e-Stat
Réutilisation du flacon Comment écrire du HTML
Comment gérer les données déséquilibrées
Comment augmenter les données avec PyTorch
Comment utiliser l'API Bing Search
Comment collecter des données d'apprentissage automatique
Comment mettre à jour une source de données de classeur packagée Tableau à l'aide de Python
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
Comment collecter des données Twitter sans programmation
Belle soupe
[Mémo] Comment utiliser BeautifulSoup4 (1) Afficher html
Comment définir optuna (comment écrire un espace de recherche)
Comment dessiner un graphique avec Matplotlib
Comment configurer SVM à l'aide d'Optuna
Comment configurer XG Boost à l'aide d'Optuna
Comment rechercher Google Drive dans Google Colaboratory
Comment tracer les données de lumière visible d'une galaxie à l'aide de la base de données OpenNGC en python
Comment utiliser "deque" pour les données Python
Comment télécharger des vidéos YouTube à l'aide de pytube3
Comment gérer les données de séries chronologiques (mise en œuvre)
Comment rechercher à l'aide de l'Astroquery de Python et obtenir des images ajustées avec Skyview
Comment lire les données de problème avec Paiza
Supprimez les balises HTML indésirables avec Beautiful Soup
J'ai essayé de notifier la mise à jour de "Hameln" en utilisant "Beautiful Soup" et "IFTTT"
[Python] Comment enregistrer des images sur le Web à la fois avec Beautiful Soup
Comment afficher la carte à l'aide de l'API Google Map (Android)
Comment créer des exemples de données CSV avec hypothèse
Essayez d'utiliser django-import-export pour ajouter des données csv à django
Comment coder un drone en utilisant la reconnaissance d'image
Comment configurer une forêt aléatoire à l'aide d'Optuna
[Django] Comment obtenir des données en spécifiant SQL.
[Python] Comment lire les données de CIFAR-10 et CIFAR-100
Comment utiliser les outils d'analyse de données pour les débutants
[Introduction à Python] Comment gérer les données au format JSON
Comment ajouter un chemin de recherche de module Python
Comment créer des données à mettre dans CNN (Chainer)
Comment configurer une forêt aléatoire à l'aide d'Optuna
Comment lire les données de séries chronologiques dans PyTorch
Convertir les données au format json en txt (en utilisant yolo)
Nettoyage des données Comment gérer les valeurs manquantes et aberrantes
Comment mettre en ligne sur un Drive partagé à l'aide de pydrive
Comment désinstaller un module installé à l'aide de setup.py
Belles éclaboussures de soupe
[Pour les débutants] Comment afficher des cartes et des champs de recherche à l'aide de l'API Javascript GoogleMap
Enregistrez le texte de toutes les notes Evernote dans SQLite à l'aide de Beautiful Soup et SQL Alchemy
[Rails] Comment obtenir des informations de localisation à l'aide de l'API de géolocalisation
100 langage traitement knock-92 (utilisant Gensim): application aux données d'analogie
Comment utiliser xgboost: classification multi-classes avec des données d'iris
Comment appliquer des marqueurs uniquement à des données spécifiques avec matplotlib
Comment lire les définitions de table générées dynamiquement à l'aide de SQL Alchemy