Grattage avec Python et belle soupe

Il y a déjà beaucoup d'histoires sur le scraping en Python dans le monde et dans Qiita, mais je pense qu'il y a beaucoup d'informations que pyquery est facile à utiliser. Personnellement, j'aimerais que vous connaissiez les bienfaits de Beautiful Soup, alors j'aimerais utiliser Beautiful Soup ici.

À propos, cette entrée est principalement un résumé de la documentation de Beautiful Soup 4. Consultez la documentation pour plus d'informations.

Anglais http://www.crummy.com/software/BeautifulSoup/bs4/doc/

Japonais http://kondou.com/BS4/

Malentendu courant

Il y a une opinion que pyquery est plus facile à utiliser que Beautiful Soup en ce sens qu'il peut gérer le HTML en utilisant un sélecteur css comme jQuery, mais ** cela peut également être fait avec Beautiful Soup. ** (Je ne connais pas l'ancienne version) Je vais vous expliquer comment faire ci-dessous.

À propos de la version

La version actuelle est Beautiful Soup 4. Veuillez noter qu'il existe de nombreux articles de commentaires sur les anciennes versions. Cependant, le code qui a fonctionné sur Beautiful Soup3 devrait fonctionner même si vous le remplacez par Beautiful Soup4 dans de nombreux cas.

Installation

$ pip install beautifulsoup4

Facile à utiliser

Créer un objet BeautifulSoup

Lorsqu'il s'agit de HTML simple, ce sera comme suit.

from bs4 import BeautifulSoup

html = """
	<html>
	...
	</html>
"""

soup = BeautifulSoup(html)

De plus, comme les URL ne peuvent pas être gérées directement, il est recommandé de les combiner avec urllib2 etc. lors de la gestion des sites Web.

import urllib2
from bs4 import BeautifulSoup

html = urllib2.urlopen("http://example.com")

soup = BeautifulSoup(html)

Si vous recevez un avertissement concernant l'analyseur HTML ici, veuillez spécifier l'analyseur en fonction du message. (Pour plus de détails, voir [À propos de HTML Parser](# html% E3% 83% 91% E3% 83% BC% E3% 82% B5% E3% 83% BC% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6))

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

Comment obtenir une balise simple

Pour obtenir toutes les balises A à partir du HTML

soup.find_all("a")

L'objet `` <class'bs4.element.ResultSet '>' 'qui peut être obtenu avec ceci peut être traité comme une liste.

Pour obtenir uniquement le premier au lieu de toutes les balises

soup.find("a")

Ou

soup.a

soup.find (" a ") et soup.a renverront None si la balise n'existe pas dans le HTML.

Obtention des informations de balise

Pour obtenir les attributs de la balise obtenue

soup.a.get("href")

Pour obtenir les caractères de la balise obtenue

soup.a.string

Bien sûr, vous pouvez également obtenir des balises imbriquées

soup.p.find_all("a")

Obtenez des balises avec des conditions spécifiques

Vous pouvez facilement obtenir des balises en réduisant les conditions par attributs. Pour obtenir toutes les balises avec lien de classe et href / link, par exemple <a href="/link" class="link">

soup.find_all("a", class_="link", href="/link")

Ou

soup.find_all("a", attrs={"class": "link", "href": "/link"})

Notez que class est un mot réservé en Python, donc ce sera class_.

De plus, vous n'avez pas à spécifier la balise.

soup.find_all(class_="link", href="/link")
soup.find_all(attrs={"class": "link", "href": "/link"})

Obtenir des balises à l'aide d'expressions régulières

Pour obtenir toutes les balises commençant par b, telles que les balises B et les balises BODY

import re
soup.find_all(re.compile("^b"))

Pour obtenir toutes les balises qui ont des attributs href, y compris "lien"

import re
soup.find_all(href=re.compile("link"))

Pour obtenir toutes les balises A qui contiennent "bonjour" dans la chaîne à l'intérieur de la balise

import re
soup.find_all("a", text=re.compile("hello"))

Obtenir des balises à l'aide du sélecteur CSS

Si vous utilisez select '' au lieu de find_all '', vous pouvez obtenir les balises en utilisant le sélecteur css.

soup.select("#link1")
soup.select('a[href^="http://"]')

Récrire

Ajouter des attributs aux balises

a = soup.find("a")
a["target"] = "_blank"

Utilisez `ʻunwrap`` pour supprimer la balise

html = '''
<div>
    <a href="/link">spam</a>
</div>
'''

soup = BeautifulSoup(html)
soup.div.a.unwrap()

soup.div
# <div>spam</div>

A l'inverse, si vous souhaitez ajouter une nouvelle balise, créez une balise avec soup.new_tag '' et ajoutez-la avec wrap``.

html = '''
<div>
    <a href="/link">spam</a>
</div>
'''

soup = BeautifulSoup(html)
soup.div.a.wrap(soup.new_tag("p"))

De plus, il existe de nombreuses méthodes d'opération telles que «insérer» et «extraire», de sorte que vous pouvez ajouter et supprimer de manière flexible des contenus et des balises.

production

En appelant `` prettify '', vous pouvez le formater proprement et le sortir sous forme de chaîne de caractères.

soup.prettify()

# <html>
#  <head>
#   <title>
#    Hello
#   </title>
#  </head>
#  <body>
#   <div>
#    <a href="/link">
#     spam
#    </a>
#   </div>
#   <div>
#    ...
#   </div>
#  </body>
# </html>
soup.div.prettify()

# <div>
#  <a href="/link">
#   spam
#  </a>
# </div>

À propos de l'analyseur HTML

L'analyseur HTML utilise généralement le standard Python html.parser, mais si lxml ou html5lib est installé, il sera utilisé de préférence. Pour le spécifier explicitement, spécifiez comme suit.

soup = BeautifulSoup(html, "lxml")

Si votre version Python est plus ancienne, html.parser ne pourra peut-être pas l'analyser correctement. Dans mon environnement, je pourrais analyser avec Python 2.7.3 et non avec Python 2.6.

Il est sûr d'installer autant que possible lxml ou html5lib pour une analyse correcte. Cependant, lxml etc. dépend de la bibliothèque C externe, vous devrez donc peut-être les installer en fonction de l'environnement.

De côté

Utilisations de la belle soupe

Dans mon cas, j'ai mon propre site qui stocke plusieurs articles de blog ensemble dans la base de données, mais je l'obtiens généralement à partir de RSS, mais comme le nombre de RSS est petit, dans ce cas, HTML est Beautiful Soup Je l'ai lu avec et enregistre le contenu.

De plus, lors de l'affichage du corps du blog enregistré, les publicités inutiles sont supprimées et la cible est spécifiée dans la balise a de sorte que le lien s'ouvre dans un nouvel onglet.

Référence: http://itkr.net

Je pense que Beautiful Soup est excellent pour de telles applications.

Recommended Posts

Grattage avec Python et belle soupe
Essayez de gratter avec Python + Beautiful Soup
Gratter avec une belle soupe
Grattage de table avec belle soupe
Grattage avec Python
Racler plusieurs pages avec Beautiful Soup
Scraping avec Node, Ruby et Python
Grattage avec Python
Grattage avec Python, Selenium et Chromedriver
Gratter avec une belle soupe en 10 minutes
Grattage de site Web avec Beautiful Soup en Python
[Python] Gratter une table avec Beautiful Soup
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
Ma belle soupe (Python)
J'ai essayé différentes choses avec Python: le grattage (Beautiful Soup + Selenium + PhantomJS) et l'analyse morphologique
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
Scraping RSS avec Python
Grattage de la nourriture avec python et sortie en CSV
Paramètres lors de l'utilisation de requêtes Python 3 et de Beautiful Soup avec crostini sur Chromebook
Triez les visages d'anime en grattant les pages de personnages d'anime avec Beautiful Soup et Selenium
Écrivez un "bot" de scraping web sans tête de base en Python avec Beautiful Soup 4
Programmation avec Python et Tkinter
J'ai essayé de gratter avec Python
Chiffrement et déchiffrement avec Python
Web scraping avec python + JupyterLab
Grattage au sélénium en Python
Python et matériel - Utilisation de RS232C avec Python -
Grattage avec Selenium + Python Partie 1
Grattage avec chromedriver en python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Scraping prévisions météorologiques avec python
Grattage avec Selenium + Python Partie 2
python avec pyenv et venv
J'ai essayé de gratter avec du python
Web scraping débutant avec python
Pratique de l'exploration avec Beautiful Soup
Fonctionne avec Python et R
[Python] Supprimer en spécifiant une balise avec Beautiful Soup
Méthode de test automatisée combinant Beautiful Soup et Selenium (Python)
Communiquez avec FX-5204PS avec Python et PyUSB
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Belle soupe
Scraping avec Selenium en Python (Basic)
[Python] Un mémorandum de belle soupe4
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
[Scraping] Scraping Python
Exploration Web, scraping Web, acquisition de caractères et sauvegarde d'image avec python