2017-10-27 3 views
0

이 코드는 2 개의 필수 인수와 1 개의 필수 인수를 요구해야하며 'format'및 'type'인수는 선택적이며 'url'은 웹 사이트의 주소가 될 필수 인수입니다. 이미지를 다운로드하고 ('jpg'및/또는 .png 형식 이미지, 'type'인수에서 제공하는 값에 의존) 이미지를 개별 이미지 또는 단일 JSON 파일로 저장하려고합니다 ('format' 인수) 내가 잘못 가고 어디, 내가 오류를 얻고 것은 당신이파이썬에서 argparse 인수에 입력을 전달하는 방법

import argparse 
import base64 
import json 
import os 
from bs4 import BeautifulSoup 
import requests 



def scrape(url,format_,type_): 
    try: 
     page = requests.get(url) 
    except requests.RequestException as rex: 
     print(str(rex)) 
    else: 
     soup = BeautifulSoup(url,'html.parser') 
     images = _fetch_images(soup,url) 
     images = _filter_images(images,type_) 
     _save(images,format_) 

def _fetch_images(soup,base_url): 
    images = [] 
    for img in soup.find_all('img'): 
     src = img.get('src') 
     img_url = ('{base_url}/{src}'.format(base_url,src)) 
     name = img_url.split('\\')[-1] 
     images.append(dict(name=name,url=img_url)) 
return images 

def _filter_images(images,type_): 
    if type == 'all': 
     return images 
    ext_map = {'png':['.png'],'jpg':['.jpg','.jpeg']} 
    return [img for img in images if 
      _match_extension(img['name'],ext_map(type_))] 

def _match_extension(filename,extension_list): 
    name,extension = os.path.splittext(filename.lower()) 
    return extension in extension_list 

def _save(images,format_): 
    if images: 
     if format_=='img': 
      _save_images(images) 
     else: 
      _save_json(images) 
      print('Done!') 
    else: 
     print('there are no images!') 

def _save_images(images): 
    for img in images: 
     img_data = requests.get(img['url']).content 
     with open(img['name'],'wb') as f: 
     f.write(img_data) 

def _save_json(images): 
    data = {} 
    for img in images: 
     img_data = requests.get(img['url']).content 
     b64_img_data = base64.b64encode(img_data) 
     str_img_data = b64_img_data.decode('utf-8') 
     data[img['name']]=str_img_data 
    with open('images.json','w') as ijson: 
     ijson.write(json.dump(data)) 


if __name__ == "__main__": 
    parser = argparse.ArgumentParser(
     description='Scrape a webpage.') 
    parser.add_argument(
     '-t', 
     '--type', 
     choices=['all', 'png', 'jpg'], 
     default='all', 
     help='The image type we want to scrape.') 
    parser.add_argument(
     '-f', 
     '--format', 
     choices=['img', 'json'], 
     default='img', 
     help='The format images are saved to.') 
    parser.add_argument(
     'url', 
     help='The URL we want to scrape for images.') 
    args = parser.parse_args() 
    args.url = str(input('enter the url\n')) 
    args.format = str(input('enter img or json \n')) 
    args.type = str(input('enter all or png or jpg')) 
    scrape(args.url,args.format,args.type) 

내가 PyCharm에서 실행하고자하는 오류 난이 있어요 .. 여기 내 코드는, 말할 수

+0

PyCharm 메뉴'Run'에서 명령 줄 인수 (필드 중 하나)를 추가 할 수 있습니다. 나는 argparse에 관해 모른다. 그러나 나는 그 논증을 찾고 있다고 생각한다. 거기에 인수로 URL을 추가하고 다시 시도하십시오 :). 이 https://i.stack.imgur.com/6KQF2.gif – voiDnyx

답변

0

Pycharm에서 함수에 매개 변수를 전달하려면 Run -> Edit Configurations으로 이동하여 매개 변수를 설정하십시오.

또는 명령 줄에서 지정한 매개 변수를 사용하여 프로그램을 호출 해보십시오.

+0

그래, 마침내 그것은 작동하지만, 당신은 우리가 c/C++ (예 : cin> > var;), 매우 도움이 될 것입니다. –

+0

@RISHABHRAI https://stackoverflow.com/questions/28990034/whats-the-equivalent-for-while-cin-var-in-python – alex

관련 문제