Невозможно извлечь изображения с веб-страницы в Python, используя красивую су - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь извлечь все изображения из приведенного ниже URL-адреса, однако я не понимаю HTTP-ошибку 403: Forbidden, можно ли о ней позаботиться во время обработки ошибок, или просто URL-адрес нельзя удалить из-за ограничений?

from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib.request


def make_soup(url):
    html = urlopen(url).read()
    return BeautifulSoup(html)

def get_images(url):
    soup = make_soup(url)
    #this makes a list of bs4 element tags
    images = [img for img in soup.findAll('img')]
    print (str(len(images)) + "images found.")
    print("downloading to current directory ")

    #compile our unicode list of image links
    image_links = [each.get('src') for each in images]
    for each in image_links:
        filename=each.split('/')[-1]
        urllib.request.urlretrieve(each,filename)
    return image_links

get_images("https://opensignal.com/reports/2019/04/uk/mobile-network-experience")

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Вы можете использовать эту функцию для удаления изображения. использование тега img в настоящее время бесполезно. Мы можем реализовать что-то вроде ниже, что будет соответствовать требованию. Он не ретранслируется ни на какие теги, поэтому, где бы ни была ссылка на изображение, он будет ее захватывать.

def extract_ImageUrl(soup_chunk):
    urls_found = []
    for tags in soup_chunk.find_all():
        attributes = tags.attrs
        if str(attributes).__contains__('http'):
            for links in attributes.values():
                if re.match('http.*\.jpg|png',str(links)):
                    if len(str(links).split()) <=1:
                        urls_found.append(links)
                    else:
                        link = [i.strip() for i in str(links).split() if re.match('http.*\.jpg|png',str(i))]
                        urls_found = urls_found + link
    print("Found {} image links".format(len(urls_found)))
    return urls_found

Это первоначальная мысль, требуются обновления, чтобы сделать ее намного лучше.

0 голосов
/ 10 мая 2019

для некоторых сайтов необходимо указать заголовок User-Agent

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
import urllib.request


def make_soup(url):
    site = url
    hdr = {'User-Agent': 'Mozilla/5.0'}
    req = Request(site, headers=hdr)
    page = urlopen(req)
    return BeautifulSoup(page)
...