Python - quote, quote_plus, encode('ascii')

YJ·2023년 4월 8일
from urllib.parse import quote_plus

from urllib.parse import quote_plus

  • Package: urllib

    • URL을 통해 작업을 수행하는 Module들의 Package
  • Package 'urllib'의 Module: parse

    • URL의 구문 분석을 하기 위한 메서드 정의
  • parse의 메소드: quote

    • URL에서 사용할 수 없는 문자를 URL에 사용되는 '문자열'로 인코딩
    • 주로 인자로 주어진 문자열 중 비 ASCII 문자를 인코딩하여 문자열로 변환해서 반환
    • ASCII 문자여도 'URL에서 안전하지 않은 문자'는 utf-8에 따라 URL 인코딩 후 문자열로 반환
    • 공백을 '%20'기호로 인코딩(utf-8 방식으로 %xx 형식으로 인코딩)
  • parse의 메소드: quote_plus

    • URL에서 사용할 수 없는 문자를 URL에 사용되는 '문자열'로 인코딩
    • 주로 인자로 주어진 문자열 중 비 ASCII 문자를 인코딩하여 문자열로 변환해서 반환
    • ASCII 문자여도 'URL에서 안전하지 않은 문자'는 utf-8에 따라 URL 인코딩 후 문자열로 반환
    • 공백을 '+'기호로 변환
  • encode('ascii')
    - 문자열을 ASCII 인코딩으로 변환하는 기능

    • 비 ASCII 문자를 표현할 수는 없음
    • 컴퓨터가 이해할 수 있는 byte 타입으로 인코딩

quote, quote_plus: 아스키코드 형식이 아닌 글자를 URL 인코딩

  • urllib.parse.quote(string, safe='/', encoding='utf-8', errors='strict')
    • string: 특수문자가 포함 된 문자열
    • safe: 변환하지 않을 특수문자 지정
      • default: '/'
    • encoding: 인코딩 방식
      • default: 'utf-8'
    • errors: 인코딩 에러를 처리하는 방식
      • default: 'strict'
    • return type: str
  • urllib.parse.quote_plus(string, safe='', encoding='utf-8', errors='strict')
    • string: 특수문자가 포함 된 문자열
    • safe: 변환하지 않을 특수문자 지정
      • default: ''
        • default 값이 없음
        • 변환하지 않을 특수문자를 따로 지정해줘야함
    • encoding: 인코딩 방식
      • default: 'utf-8'
    • errors: 인코딩 에러를 처리하는 방식
      • default: 'strict'
    • return type: str
  • quote와 quote_plus의 차이점
    • 공백 변환
      quote
      : '%20'으로 변환
      quote_plus
      : '+'기호로 변환
    • safe 인자의 기본 값 유무
      quote
      : default: '/'
      quote_plus
      : default: ''(default 값이 없음)

Python으로 Google 브라우저에서 '안녕하세요' 검색해보기

import requests
from urllib.parse import quote_plus
url_addr = "https://www.google.com/search?q={}\
      &oq={}&aqs=chrome..\
      69i57j35i39j46i131i199i433i465i512j0i131i433i512j46i131i199i433i465i512j0i3j46i131i340i433i512j0i3l2.1281j0j15\
      &sourceid=chrome&ie=UTF-8"
special_literal = '안녕하세요'
url_addr_quote = url_addr.format(quote_plus(special_literal), quote_plus(special_literal))
response = requests.get(url_addr_quote)
print(response.status_code)
  • Google에서 '안녕하세요' 검색
  • URL을 확인해보니 q, oq key의 value가 'utf-8 형식으로 인코딩'된 것을 확인
  • 목표
    • urllib.parse.quote_plus의 인자로 '특수문자'를 전달하여 url 인코딩 하여 str로 반환
    • quote_plus로 '안녕하세요'를 한글 -> utf-8로 인코딩 후 requets로 get 요청(get의 인자로 str(문자열) 전달)
    • status_code로 응답이 제대로 되었는지 확인
  • 결과
    • '안녕하세요' 한글 특수문자가 utf-8 형식으로 인코딩 되어 URL에 추가된 것을 확인
    • 이 URL을 통해 get 메서드로 HTTP 호출

urllib.parse.quote와 encode('ascii')의 차이점

  • urllib.parse.quote와 encode('ascii')는 다른 목적을 가진 기능
    - urllib.parse.quote
    - 반환타입: str
    - URL에 사용되는 문자열로 인코딩
    - URL은 ASCII 코드 표에 있는 문자만 사용 가능
    - 특수문자(비 ASCII ex> 한글, 일본어 등)를 인코딩 한 str(문자열)을 URL에 안전하게 사용
    - URL에서 사용할 수 없는 문자를 인코딩 한 문자열을 URL에 포함
      ```python
      import urllib.parse
      text = '한글'
      url_encoded_text = urllib.parse.quote(text)
      print(url_encoded_text)	# '%ED%95%9C%EA%B8%80'
      ```
  • encode('ascii')
    - 반환타입: byte
    - 문자열을 ASCII 코드 표로 인코딩하여 byte 타입으로 반환
    - 비 ASCII 문자를 인코딩할 수 없음
    - ASCII 문자만 사용하는 경우에만 이 함수를 사용

urllib.parse.quote의 URL 인코딩?

  • URL에 포함될 수 없는 문자들을 안전하게 전송할 수 있도록 인코딩 하는 함수
  • RFC 3986 표준에 따라 URL의 Query String에 사용되는 문자들 중 일부 문자를 인코딩
  • Quety String에 사용가능 한 문자(URL 인코딩에서 안전한 문자로 간주하는 것)
      1. 알파벳 (A-Z, a-z)
      1. 숫자 (0~9)
      1. 일부 특수문자 (- _ . ~)
    • 이러한 'URL 인코딩에서 안전한 문자'는 URL 인코딩 될 때 변형 없이 그대로 포함될 수 있음
    • 이외의 모든 문자들은 인코딩되어 문자열로 반환
    • URL에 포함될 수 없는 문자(URL 인코딩 시에 안전하지 않은 문자)는 올바르게 해석하지 못할 수 있음
    • 정리
      • URL 인코딩에서 안전한 문자
        - 변형없음
      • URL 인코딩에서 안전하지 않은 문자
        • utf-8 형식에 따라 인코딩되어 URL 문자열로 사용
      • ASCII 문자라고 모두 'URL 인코딩에서 안전한 문자'는 아니다.

Query란?

  • Query
    - 데이터 베이스에서 데이터를 검색, 수정하기 위해 사용되는 명령문

Query String과 Query Parameter

  • Query String

    • URL의 끝에 ?를 사용하여 시작
    • key=value 형태로 구성된 Query Parameter를 &로 구분하여 연속적으로 나열 한 것
      https://www.example.com/search?q=python&category=books
    • '?q=python&category=books'가 Query String
    • URL에 '데이터를 전달'하기 위해 사용
  • Query Parameter

    • Query String에 포함된 key=value 쌍 중에서 하나의 key=value 쌍을 의미
    • 위 예에서 'q=python', 'category=books'는 각각의 하나의 Query Parameter
    • Query String에 포함된 데이터를 '서버에서 사용할 수 있도록' 전달

내 생각 - urllib.parse.quote와 encode('ascii') 사용 방법

  • Python으로 HTTP 요청을 통해 원하는 데이터 접근할 경우, 다음과 같은 방법으로 하면 될 것 같다.
      1. HTTP 요청을 할 url을 가져옴
      1. Query Paramter의 value 부분은 사용자가 입력하게함
      1. value 부분을 urllib.parse.quote로 특수문자를 인코딩
        (인코딩 된 url은 str 타입)
      1. quote로 인코딩하면, URL 형식으로 특수문자가 인코딩
        (인코딩 된 url은 str 타입)
      • 4.1 requests 라이브러리로 get 요청시에는 이 URL을 바로 요청
        - requests 라이브러리는 str 타입의 URL로 GET 요청 가능
      • 4.2 socket으로 통신할 경우에는 URL str(문자열)은 encode('ascii')로 인코딩 후 요청
        - byte 객체로 데이터를 요청해야 하므로, encode('ascii')로 인코딩 필요
profile
dev

0개의 댓글