import re
import requests
from pathlib import Path
import requests
from bs4 import BeautifulSoup
output_folder = Path('Arbeitsordner')
output_folder.mkdir(exist_ok=True)
Holen Sie sich das HTML-Element mithilfe von Anforderungen.
url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'
html = requests.get(url).text
Es ist schwer zu lesen, wie es ist, also schreiben Sie die Struktur mit Beautiful Soup neu
soup = BeautifulSoup(html, 'lxml')
Überprüfen Sie die Suppe, um festzustellen, wo sich die gewünschten Informationen befinden. Dieses Mal möchte ich das Wetter von morgen morgen bekommen.
Suchen Sie das Wort mit Strg + F.
Ich konnte class = "yjMt" bestätigen.
today = soup.select('.yjMt')
Wenn Sie ein Div erhalten möchten, wählen Sie ('div') Wenn die Klasse bekommen will ('.class') Wenn Sie die ID erhalten möchten ('# id') Wenn Sie img einnehmen möchten, istoup.find_all ('img') möglicherweise bequemer als select
Überprüfen Sie den erfassten Inhalt
today
[<h2 class="yjMt">Heute morgen Wetter</h2>,
<h2 class="yjMt">Wöchentliches Wetter</h2>,
<h2 class="yjMt">Genaues Wetter</h2>]
Da drei Elemente entfernt werden, muss die Listennummer angegeben und extrahiert werden.
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>]
Da die Informationen von morgen heute eingehen, geben Sie die Listennummer an. Entfernen Sie unnötige Zeichenfolgen.
today_low= str(low[0]).replace('<li class="high"><em>', '').replace('</em>', '').replace('</li>', '')
Klicken Sie mit der rechten Maustaste auf das Bild auf der Website Kopieren Sie die URL und suchen Sie mit Strg + F nach der entsprechenden URL.
Es stellt sich heraus, dass die Klasse Bild ist
pict = soup.select('.pict')
pict
[<p class="pict"><img alt="Bewölkt manchmal Regen" border="0" src="https://s.yimg.jp/images/weather/general/next/size150/203_day.png "/>Bewölkt manchmal Regen</p>,
<p class="pict"><img alt="Bewölkt dann sonnig" border="0" src="https://s.yimg.jp/images/weather/general/next/size150/266_day.png "/>Bewölkt dann sonnig</p>,
<div class="cmnMod pict">
<ul>
<li>
<dl>
<dt>Regenwolkenradar</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="Bewegung der Regenwolken" 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>Wetterkarte</dt>
<dd><a data-ylk="slk:chart; pos:1" href="/weather/chart/"><img alt="Wetterkarte" 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>Meteorologischer Satellit</dt>
<dd><a data-ylk="slk:stlt; pos:1" href="/weather/satellite/"><img alt="Meteorologischer Satellit" 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>]
Ich möchte nur die URL des Bildes erhalten. Da vor und nach der Bild-URL ein "" "steht, verwenden Sie dieses als angegebenes Zeichen, um die Zeichen zu trennen. Geben Sie die Listennummer mit der entsprechenden URL aus der getrennten Liste an.
sp = re.split('"', str(pict))
sp[7]
'https://s.yimg.jp/images/weather/general/next/size150/203_day.png'
Extrahieren Sie das Bild aus der URL und zeigen Sie es in PIL an
from PIL import Image
from io import BytesIO
img = requests.get(sp[7]).content
today_pict = Image.open(BytesIO(img))
today_pict
Es gibt auch eine Möglichkeit, nur das Bild im a-Tag abzurufen
a_img = soup.select('a > img')
Von der Extraktion aufteilen und durch Anpassen der Erweiterung auf nur das Bild eingrenzen
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