Quand j'ai essayé le scraping Web sans même connaître la grammaire de Python, je me suis retrouvé coincé de différentes manières, donc je vais le résumer avec un mémorandum. La mise en œuvre est un programme qui acquiert des données de boisson à partir d'un certain site Web et les génère dans un fichier CSV.
J'ai rapidement trouvé un moyen d'obtenir des données à partir d'une page, mais comment les obtenir à partir de plusieurs pages?
import requests
from bs4 import BeautifulSoup
import re
#Un tableau qui contient des URL pour plusieurs pages
urls_ary = []
#Recherchez toutes les balises a de la page supérieure, obtenez leurs attributs href et ajoutez-les au tableau
url = 'http://hoge/top'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
for a in soup.find_all('a', href=re.compile('^huga')):
urls_ary.append(a.get('href'))
#Arrangement pour mettre les données de boisson
drinks_ary = []
#Tournez en boucle pour accéder à toutes les pages
for page in urls_ary:
url = 'http://hoge/top/'
r = requests.get(url + str(page))
soup = BeautifulSoup(r.text, 'lxml')
#Si la balise span contient le nom de la boisson, récupérez la balise span
tag = soup.find('span')
drinks_ary.append(tag)
find_all ('a', href = re.compile ('^ huga'))
, toutes les balises dont les liens commencent par huga
(<a '' J'essaye d'obtenir seulement href = "huga ...> </a>"
).
--Si vous voulez rechercher toutes les balises, utilisez `` find_all ('a') '' sans cette option. Pas besoin de «import re».Comme mentionné ci-dessus, j'étais triste que le processus se soit arrêté en raison d'une erreur inattendue lors de la rotation en boucle et que le programme soit à nouveau passé de 1. Même s'il y a une erreur, je veux l'ignorer pour le moment et mettre fin au processus. Les exceptions peuvent être traitées en utilisant «try» et «sauf».
for page in urls_ary:
url = 'http://hoge/top/'
r = requests.get(url + str(page))
soup = BeautifulSoup(r.text, 'lxml')
#Essayez du code qui peut provoquer des erreurs, except
try:
tag = soup.find('span')
drinks_ary.append(tag)
#Si une erreur se produit, ignorez ce processus et entrez dans la boucle suivante.
except:
continue
Si vous utilisez .text '', vous pouvez l'obtenir pour le moment. Pour plus d'informations sur les différences entre
.stringet
.text``, voir Cet article (Effacer les différences dans le comportement des chaînes et du texte dans Beautiful Soup - Python) / languages / python / bs4-text-or-string /) était personnellement facile à comprendre.
# <html>
# <body>
# <ul>
# <li>Non précisé</li>
# <li>Non précisé</li>
# <li>Il est précisé</li>
# <li>Non précisé</li>
# </ul>
# </body>
# </html>
import requests
from bs4 import BeautifulSoup
url = 'http://hoge/top'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'lxml')
#Troisième<li>Obtenir le tag
li_3rd = soup.select(body > ul > li:nth-of-type(3))
Au fait, il peut être spécifié avec nth-child () '', mais le comportement est plus compliqué que
nth-of-type``.
# <html>
# <body>
# <div>
# <h1>Non précisé</h1>
# <p>Non précisé</p>
# <h2>Non précisé</h2>
# <p>spécifier</p>
# </div>
# </body>
# </html>
#Seconde<p>Je veux obtenir un tag
# nth-of-type
soup.select('body > div > p:nth-of-type(2)')
# nth-child
soup.select('body > div > nth-child(4)')
Il est facile d'utiliser le nth-of-type '', car je veux obtenir la deuxième balise
'' à l'intérieur de la balise <div> ''. Soit
nième de type (2) ''.
Par contre, la deuxième balise <p>
peut être considérée comme la quatrième des balises de <div> '', donc
nth-child (4) '' Peut également être spécifié.
Si vous vérifiez le html d'un site Web à l'aide de l'outil de développement de Chrome (?) Et spécifiez un sélecteur CSS basé sur celui-ci, vous obtiendrez rarement un élément différent de celui spécifié.
C'est du côté du site Web où il y a une balise de début pour s et html mais pas de balise de fermeture, et du côté Chrome où la balise <tbody> '' est insérée arbitrairement à l'intérieur de la balise