Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

Python AttributeError:'module' 개체에 'urlopen' 속성이 없습니다.

urllib 모듈은 request 함수는 Python 3에서 액세스됩니다. 즉, Python 2에서 수행하는 방식으로 "urlopen" 함수를 참조하려고 하면 "AttributeError:'module' 개체에 'urlopen' 속성이 없습니다." 오류가 발생합니다. .

이 가이드에서는 이 오류의 의미와 발생 이유에 대해 설명합니다. 이 오류의 예를 살펴보고 해결 방법을 배울 수 있습니다.

AttributeError:'module' 개체에 'urlopen' 속성이 없습니다.

"urllib" 모듈은 URL 열기 및 웹사이트에서 데이터 읽기와 관련된 여러 기능을 제공합니다. 이 라이브러리를 사용하는 구문은 Python 2와 Python 3에서 다릅니다.

Python 2에서 "urlopen"은 "urllib" 모듈의 일부입니다. 즉, urllib.urlopen을 사용하여 코드로 가져올 수 있습니다. Python 3에서 "urlopen"은 "urllib" 메서드 내 "요청" 모듈의 일부입니다.

  • 파이썬 2:urllib -> urlopen
  • 파이썬 3:urllib -> 요청 -> urlopen

"요청" 모듈은 "urllib" 패키지의 많은 웹 요청 기능이 번들로 제공되는 곳입니다. 해당 속성이 포함되지 않은 모듈에서 속성에 액세스하려고 하면 AttributeErrors가 발생합니다. 이 경우 "urlopen"은 "urllib" 모듈의 일부가 아닙니다.

예시 시나리오

JSONPlaceholder라는 서비스에서 데이터를 검색하는 프로그램을 빌드하십시오. 이 서비스는 예제에 사용할 수 있는 더미 데이터를 제공합니다.

ID가 #2인 단일 게시물을 검색합니다. 시작하려면 urllib 모듈을 가져옵니다.

import urllib

이 명령문을 사용하면 프로그램의 "urllib" 모듈 내에서 함수를 사용할 수 있습니다.

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

그런 다음 "urlopen"을 사용하여 요청합니다. 이렇게 하면 JSONPlaceholder API의 끝점에서 데이터를 검색할 수 있습니다.

data = urllib.urlopen("https://jsonplaceholder.typicode.com/posts/2")
contents = data.read()
print(as_json)

이 코드는 JSONPlaceholder API에서 ID가 #2인 게시물에 대한 데이터를 읽습니다.

이 코드는 JSON 문자열 형식의 요청 응답을 print 문을 사용하여 콘솔에 출력합니다. 코드를 실행하고 어떤 일이 일어나는지 확인하십시오.

Traceback (most recent call last):
  File "main.py", line 4, in <module>
	    data = urllib.urlopen("https://jsonplaceholder.typicode.com/posts/2")
AttributeError: module 'urllib' has no attribute 'urlopen'

프로그램이 오류를 반환합니다.

해결책

Python 2 구문을 사용하여 "urlopen" 메서드에 액세스하고 있습니다. "urlopen"은 Python 3에서 "urllib"의 속성이 아닙니다. "urlopen"을 "urllib"의 속성으로 참조하므로 프로그램이 제대로 실행되지 않습니다.

이 문제를 해결하려면 "urllib" 모듈에서 "request" 모듈을 가져옵니다. 이 모듈에는 "urlopen" 메서드가 포함되어 있습니다.

import urllib.request

다음으로 JSONPlaceholder API에서 데이터를 검색할 때 urllib.request 모듈을 참조하도록 코드를 변경합니다.

data = urllib.request.urlopen("https://jsonplaceholder.typicode.com/posts/2")
contents = data.read().decode('utf-8')

print(contents)

이 코드는 우리가 호출하는 API 엔드포인트의 내용을 읽을 것입니다. 코드를 실행해 보겠습니다.

{
  "userId": 1,
  "id": 2,
  "title": "qui est esse",
  "body": "est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla"
}

decode()를 사용하여 수신한 응답을 디코딩했습니다. 방법. urlopen()에서 반환된 값을 읽을 수 있도록 이 작업을 수행합니다. 메소드를 문자열로.

결론

"urlopen" 함수는 Python 3에서 "urllib"의 객체가 아닙니다. 이 함수에 액세스하려면 "urllib.request"를 코드로 가져오고 urllib.request.urlopen() 함수.

이제 전문가처럼 이 Python 오류를 수정하는 데 필요한 지식을 얻었습니다!