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/
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.
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.
$ pip install beautifulsoup4
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")
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.
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")
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"})
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"))
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://"]')
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.
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>
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.
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