Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

Python AttributeError:วัตถุ 'โมดูล' ไม่มีแอตทริบิวต์ 'urlopen' Solution

โมดูล urllib เปลี่ยนวิธีที่ request มีการเข้าถึงฟังก์ชันใน Python 3 ซึ่งหมายความว่าหากคุณพยายามอ้างอิงฟังก์ชัน "urlopen" ในแบบที่คุณทำใน Python 2 คุณจะพบกับ "AttributeError:'โมดูล' วัตถุไม่มีแอตทริบิวต์ 'urlopen'" .

คู่มือนี้อธิบายความหมายของข้อผิดพลาดนี้และสาเหตุที่ทำให้เกิดข้อผิดพลาด โดยจะอธิบายตัวอย่างข้อผิดพลาดนี้เพื่อให้คุณได้เรียนรู้วิธีแก้ไข

AttributeError:วัตถุ 'โมดูล' ไม่มีแอตทริบิวต์ 'urlopen'

โมดูล “urllib” มีฟังก์ชันมากมายที่เกี่ยวข้องกับการเปิด URL และการอ่านข้อมูลจากเว็บไซต์ ไวยากรณ์สำหรับการใช้ไลบรารีนี้แตกต่างกันระหว่าง Python 2 และ Python 3

ใน Python 2 “urlopen” เป็นส่วนหนึ่งของโมดูล “urllib” ซึ่งหมายความว่าคุณสามารถนำเข้ารหัสของคุณโดยใช้ urllib.urlopen ใน Python 3 "urlopen" เป็นส่วนหนึ่งของโมดูล "request" ภายในเมธอด "urllib":

  • Python 2:urllib -> urlopen
  • Python 3:urllib -> คำขอ -> urlopen

โมดูล "คำขอ" เป็นที่รวมฟังก์ชันคำขอเว็บจำนวนมากในแพ็คเกจ "urllib" AttributeErrors เกิดขึ้นเมื่อคุณพยายามเข้าถึงแอตทริบิวต์จากโมดูลที่ไม่มีแอตทริบิวต์นั้น ในกรณีนี้ “urlopen” ไม่ได้เป็นส่วนหนึ่งของโมดูล “urllib”

ตัวอย่างสถานการณ์

สร้างโปรแกรมที่ดึงข้อมูลจากบริการที่เรียกว่า JSONPlaceholder บริการนี้ให้ข้อมูลจำลองที่คุณสามารถใช้สำหรับตัวอย่างของคุณ

ดึงข้อมูลโพสต์เดียวด้วย ID #2 ในการเริ่มต้น ให้นำเข้าโมดูล urllib:

import urllib

คำสั่งนี้ให้คุณใช้ฟังก์ชันจากภายในโมดูล “urllib” ในโปรแกรมได้

81% ของผู้เข้าร่วมกล่าวว่าพวกเขารู้สึกมั่นใจมากขึ้นเกี่ยวกับโอกาสในการทำงานด้านเทคโนโลยีหลังจากเข้าร่วม bootcamp จับคู่กับ Bootcamp วันนี้

ผู้สำเร็จการศึกษาจากหลักสูตร bootcamp โดยเฉลี่ยใช้เวลาน้อยกว่าหกเดือนในการเปลี่ยนอาชีพ ตั้งแต่เริ่มต้น bootcamp ไปจนถึงหางานแรก

ถัดไป ทำการร้องขอโดยใช้ “urlopen” สิ่งนี้จะช่วยให้คุณดึงข้อมูลจากปลายทางบน JSONPlaceholder API:

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

รหัสนี้อ่านข้อมูลสำหรับโพสต์ด้วย ID #2 บน JSONPlaceholder API

โค้ดจะพิมพ์การตอบกลับจากคำขอของเรา ซึ่งจัดรูปแบบเป็นสตริง JSON ไปยังคอนโซลโดยใช้คำสั่งการพิมพ์ เรียกใช้รหัสและดูว่าเกิดอะไรขึ้น:

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” ไม่ใช่แอตทริบิวต์ของ “urllib” ใน Python 3 คุณอ้างอิง “urlopen” เป็นแอตทริบิวต์ของ “urllib” ดังนั้นโปรแกรมจึงทำงานไม่ถูกต้อง

ในการแก้ปัญหานี้ ให้นำเข้าโมดูล "คำขอ" จากโมดูล "urllib" โมดูลนี้มีวิธี "urlopen":

import urllib.request

ถัดไป เปลี่ยนรหัสเพื่อให้คุณอ้างอิงโมดูล urllib.request เมื่อคุณดึงข้อมูลจาก JSONPlaceholder API:

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" ไม่ใช่วัตถุของ "urllib" ใน Python 3 หากต้องการเข้าถึงฟังก์ชันนี้ ให้นำเข้า "urllib.request" ลงในโค้ดของคุณและอ้างอิง urllib.request.urlopen() การทำงาน.

ตอนนี้คุณมีความรู้ที่จำเป็นในการแก้ไขข้อผิดพลาดของ Python อย่างมืออาชีพแล้ว!