import re
import requests
from pathlib import Path
import requests
from bs4 import BeautifulSoup
output_folder = Path('Dossier de travail')
output_folder.mkdir(exist_ok=True)
Obtenez l'élément html à l'aide de requêtes.
url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'
html = requests.get(url).text
C'est difficile à lire tel quel, alors réécrivez la structure avec Beautiful Soup
soup = BeautifulSoup(html, 'lxml')
Vérifiez la soupe pour voir où se trouvent les informations que vous souhaitez obtenir. Cette fois, je veux obtenir ** la météo d'aujourd'hui demain **.
Recherchez le mot avec ctrl + F.
J'ai pu confirmer class = "yjMt".
today = soup.select('.yjMt')
Lorsque vous souhaitez obtenir un div, sélectionnez ('div') Quand la classe veut obtenir ('.class') Lorsque vous voulez obtenir l'identifiant ('# id') Si vous voulez prendre img, soup.find_all ('img') peut être plus pratique que de sélectionner
Vérifiez le contenu acquis
today
[<h2 class="yjMt">Aujourd'hui la météo de demain</h2>,
<h2 class="yjMt">Météo hebdomadaire</h2>,
<h2 class="yjMt">Météo précise</h2>]
Puisque trois éléments sont supprimés, il est nécessaire de spécifier le numéro de la liste et de l'extraire.
high = soup.select('.high')
low = soup.select('.low')
low
[<li class="low"><em>25</em>℃[+2]</li>,
<li class="low"><em>28</em>℃[+3]</li>]
Puisque l'information de demain arrive aujourd'hui, spécifiez le numéro de la liste. Supprimez les chaînes inutiles.
today_low= str(low[0]).replace('<li class="high"><em>', '').replace('</em>', '').replace('</li>', '')
Faites un clic droit sur l'image sur le site Copiez l'url et recherchez l'url correspondante avec ctrl + F.
Il s'avère que la classe est pict
pict = soup.select('.pict')
pict
[<p class="pict"><img alt="Nuageux parfois pluie" border="0" src="https://s.yimg.jp/images/weather/general/next/size150/203_day.png "/>Nuageux parfois pluie</p>,
<p class="pict"><img alt="Nuageux puis ensoleillé" border="0" src="https://s.yimg.jp/images/weather/general/next/size150/266_day.png "/>Nuageux puis ensoleillé</p>,
<div class="cmnMod pict">
<ul>
<li>
<dl>
<dt>Radar de nuages de pluie</dt>
<dd><a data-ylk="slk:zmradar; pos:1" href="//weather.yahoo.co.jp/weather/zoomradar/?lat=35.6965&lon=139.4472&z=10"><img alt="Mouvement des nuages de pluie" height="150" src="https://weather-pctr.c.yimg.jp/r/iwiz-weather/raincloud/1599021000/202010-0000-pf1300-20200902133000.gif?w=200&h=150" width="200"/>
</a></dd>
</dl>
</li><!--
--><li>
<dl>
<dt>Carte météorologique</dt>
<dd><a data-ylk="slk:chart; pos:1" href="/weather/chart/"><img alt="Carte météorologique" height="150" src="https://weather-pctr.c.yimg.jp/r/iwiz-weather/chart_v2/1599012878/WM_ChartA_20200902-090000.jpg?w=200&h=150" width="200"/>
</a></dd>
</dl>
</li><!--
--><li>
<dl>
<dt>Satellite météorologique</dt>
<dd><a data-ylk="slk:stlt; pos:1" href="/weather/satellite/"><img alt="Satellite météorologique" height="150" src="https://weather-pctr.c.yimg.jp/r/iwiz-weather/satellite_v2/1599022735/WM_H-JPN-IR_20200902-140000.jpg?w=200&h=150" width="200"/>
</a></dd>
</dl>
</li>
</ul>
</div>]
Je veux obtenir uniquement l'url de l'image. Puisqu'il y a un "" "avant et après l'URL de l'image, utilisez-le comme caractère spécifié pour séparer les caractères. Spécifiez le numéro de la liste avec l'URL correspondante dans la liste séparée.
sp = re.split('"', str(pict))
sp[7]
'https://s.yimg.jp/images/weather/general/next/size150/203_day.png'
Extraire l'image de l'URL et l'afficher dans PIL
from PIL import Image
from io import BytesIO
img = requests.get(sp[7]).content
today_pict = Image.open(BytesIO(img))
today_pict
Il existe également un moyen de récupérer uniquement l'img dans la balise a
a_img = soup.select('a > img')
Séparer de l'extraction et réduire uniquement l'image en faisant correspondre l'extension
str_img = str(a_img).split('"')
l_in = [s for s in str_img if '.jpg' in s]
today_pict.save("today_pict.png ")
Recommended Posts