환율 정보를 받아 환율을 변환하는 프로그램
#main7-1
from currency_converter import CurrencyConverter
cc = CurrencyConverter()
print(cc.currencies)
#main7-2
from currency_converter import CurrencyConverter
cc = CurrencyConverter('http://www.ecb.europa.eu/stats/eurofxref/eurofxref.zip')
print(cc.convert(1, 'USD', 'KRW'))
#main7-3
import requests
from bs4 import BeautifulSoup # 사이트 정보 크롤링
def get_exchange_rate(target1, target2):
# 헤더를 통해 일반적인 브라우저를 이용하여 접속한 것처럼 보이게 한다
# (헤더 없이 접속하면 로봇으로 간주하여 사이트에서 정보를 주지않음)
headers = {
'User-Agent': 'Mozilla/5.0',
'Content-Type': 'text/html; charset=utf-8'
}
#request 라이브러리를 이용하여 사이트에 접속하여 응답값 가져오기
response = requests.get("http://kr.investing.com/currencies/{}-{}".format(target1, target2), headers=headers)
#html로 가져오기
content = BeautifulSoup(response.content, 'html.parser')
containers = content.find('span', {'data-test': 'instrument-price-last'})
print(containers.text)
get_exchange_rate('usd', 'krw')
AttributeError: 'NoneType' object has no attribute 'text'
이유를 찾아보니 변수 containers에서 정의된 속성을 찾을 수 없어 None을 return 하였고 None.text를 print하라고 하니까 오류가 발생한 것이다
F12로 개발자 탭을 열어서 우리가 필요한 정보가 뭔지 확인해보았다
기존 코드 find('span', {'data-test': 'instrument-price-last'})랑 같으므로 이 부분은 잘못된게 없어보인다
print(content.find_all('span'))
[<span data-translate="unable_to_access">You are unable to access</span>, <span class="cf-no-screenshot error"></span>, <span class="cf-footer-item sm:block sm:mb-1">Cloudflare Ray ID: <strong class="font-semibold">796590a5ddcded91</strong></span>, <span class="cf-footer-separator sm:hidden">•</span>, <span class="cf-footer-item hidden sm:block sm:mb-1" id="cf-footer-item-ip">
Your IP:
<button class="cf-footer-ip-reveal-btn" id="cf-footer-ip-reveal" type="button">Click to reveal</button>
<span class="hidden" id="cf-footer-ip">121.131.143.79</span>
<span class="cf-footer-separator sm:hidden">•</span>
</span>, <span class="hidden" id="cf-footer-ip">121.131.143.79</span>, <span class="cf-footer-separator sm:hidden">•</span>, <span class="cf-footer-item sm:block sm:mb-1"><span>Performance & security by</span> <a href="https://www.cloudflare.com/5xx-error-landing" id="brand_link" rel="noopener noreferrer" target="_blank">Cloudflare</a></span>, <span>Performance & security by</span>]