โมดูล 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 อย่างมืออาชีพแล้ว!