Files
python_test/web/ladda_hem_bilder.py

63 lines
2.0 KiB
Python

import os
import re
from bs4 import BeautifulSoup
import requests
from urllib.parse import urljoin
import base64
def ladda_ner_bilder(url):
# Hämta HTML-sidan
svar = requests.get(url)
soup = BeautifulSoup(svar.text, 'html.parser')
# Hitta alla bilder
bilder = []
for img in soup.find_all('img'):
src = img.get('src')
if src:
bilder.append(src)
# Hantera inline-bilder i base64
INLINE_BILD_MÖNSTER = r'data:image/(.*?);base64,(.*)'
matcher = re.compile(INLINE_BILD_MÖNSTER)
for match in matcher.finditer(svar.text):
bild_typ = match.group(1)
bild_data = match.group(2)
bilder.append(f"data:{bild_typ};base64,{bild_data}")
# Ladda ner bilderna
bild_katalog = os.path.expanduser("~/Downloads/bilder")
if not os.path.exists(bild_katalog):
os.makedirs(bild_katalog)
for bild_url in bilder:
if not bild_url.startswith('http'):
bild_url = urljoin(url, bild_url)
if bild_url.startswith('data:'):
# Dekodera base64-strängen och spara den som en bild
format, data = bild_url.split(';base64,')
data = base64.b64decode(data)
filnamn = 'inline_' + str(len(bilder)) + '.gif'
with open(os.path.join(bild_katalog, filnamn), 'wb') as f:
f.write(data)
else:
svar = requests.get(bild_url)
if svar.status_code == 200:
filnamn = os.path.basename(bild_url).split('?')[0]
with open(os.path.join(bild_katalog, filnamn), 'wb') as f:
f.write(svar.content)
print(f"Bilden {filnamn} har laddats ner till {bild_katalog}.")
def main():
url = input("Ange URL till sidan från vilken du vill hämta bilder: ")
if not url.startswith('http'):
url = 'http://' + url
try:
ladda_ner_bilder(url)
except Exception as e:
print(f"Fel inträffade: {e}")
if __name__ == "__main__":
main()