Computer >> Máy Tính >  >> Lập trình >> Python

Python AttributeError:Đối tượng ‘mô-đun’ không có thuộc tính ‘urlopen’ Giải pháp

Mô-đun urllib đã thay đổi cách mà request hàm được truy cập bằng Python 3. Điều này có nghĩa là nếu bạn cố gắng tham chiếu đến hàm “urlopen” theo cách bạn làm trong Python 2, bạn sẽ gặp phải lỗi “AttributeError:'module' không có thuộc tính" urlopen "" .

Hướng dẫn này nói về lỗi này có nghĩa là gì và tại sao nó lại xuất hiện. Nó hướng dẫn một ví dụ về lỗi này để bạn có thể tìm hiểu cách giải quyết.

AttributeError:Đối tượng ‘module’ không có thuộc tính ‘urlopen’

Mô-đun “urllib” cung cấp một số chức năng liên quan đến việc mở URL và đọc dữ liệu từ các trang web. Cú pháp để sử dụng thư viện này khác nhau giữa Python 2 và Python 3.

Trong Python 2, “urlopen” là một phần của mô-đun “urllib”. Điều này có nghĩa là bạn có thể nhập nó vào mã của mình bằng urllib.urlopen. Trong Python 3, “urlopen” là một phần của mô-đun “yêu cầu” trong phương thức “urllib”:

  • Python 2:urllib -> urlopen
  • Python 3:urllib -> request -> urlopen

Mô-đun "yêu cầu" là nơi nhiều chức năng yêu cầu web trong gói "urllib" được đóng gói. AttributeErrors được nâng lên khi bạn cố gắng truy cập một thuộc tính từ một mô-đun không chứa thuộc tính đó. Trong trường hợp này, “urlopen” không phải là một phần của mô-đun “urllib”.

Một tình huống mẫu

Xây dựng một chương trình lấy dữ liệu từ một dịch vụ có tên là JSONPlaceholder. Dịch vụ này cung cấp dữ liệu giả mà bạn có thể sử dụng cho ví dụ của mình.

Truy xuất một bài đăng có ID # 2. Để bắt đầu, hãy nhập mô-đun urllib:

import urllib

Câu lệnh này cho phép bạn sử dụng các chức năng từ bên trong mô-đun “urllib” trong chương trình.

81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.

Sinh viên tốt nghiệp bootcamp trung bình dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.

Tiếp theo, đưa ra yêu cầu bằng cách sử dụng “urlopen”. Điều này sẽ cho phép bạn truy xuất dữ liệu từ một điểm cuối trên API JSONPlaceholder:

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

Mã này đọc dữ liệu cho bài đăng có ID # 2 trên API JSONPlaceholder.

Mã in phản hồi từ yêu cầu của chúng tôi, được định dạng dưới dạng chuỗi JSON, tới bảng điều khiển bằng cách sử dụng câu lệnh in. Chạy mã và xem điều gì sẽ xảy ra:

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'

Chương trình trả về một lỗi.

Giải pháp

Bạn đang sử dụng cú pháp Python 2 để truy cập phương thức "urlopen". “Urlopen” không phải là một thuộc tính của “urllib” trong Python 3. Bạn tham chiếu “urlopen” như một thuộc tính của “urllib” nên chương trình không chạy đúng cách.

Để giải quyết vấn đề này, hãy nhập mô-đun "yêu cầu" từ mô-đun "urllib". Mô-đun này chứa phương thức "urlopen":

import urllib.request

Tiếp theo, thay đổi mã để bạn tham chiếu đến mô-đun urllib.request khi bạn truy xuất dữ liệu từ API JSONPlaceholder:

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

print(contents)

Mã này sẽ đọc nội dung của điểm cuối API mà chúng tôi gọi. Hãy chạy mã của chúng tôi:

{
  "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"
}

Bạn đã giải mã phản hồi nhận được bằng decode() phương pháp. Làm điều này để bạn có thể đọc các giá trị được trả về bởi urlopen() phương thức dưới dạng một chuỗi.

Kết luận

Hàm “urlopen” không phải là đối tượng của “urllib” trong Python 3. Để truy cập hàm này, hãy nhập “urllib.request” vào mã của bạn và tham chiếu đến urllib.request.urlopen() chức năng.

Bây giờ bạn đã có kiến ​​thức cần thiết để sửa lỗi Python này như một người chuyên nghiệp!