AttributionError: đối tượng 'module' không có thuộc tính 'urlopen'


146

Tôi đang cố gắng sử dụng Python để tải xuống mã nguồn HTML của một trang web nhưng tôi nhận được lỗi này.

Traceback (most recent call last):  
    File "C:\Users\Sergio.Tapia\Documents\NetBeansProjects\DICParser\src\WebDownload.py", line 3, in <module>
     file = urllib.urlopen("http://www.python.org")
AttributeError: 'module' object has no attribute 'urlopen'

Tôi đang làm theo hướng dẫn ở đây: http://www.boddie.org.uk/python/HTML.html

import urllib

file = urllib.urlopen("http://www.python.org")
s = file.read()
f.close()

#I'm guessing this would output the html source code?
print(s)

Tôi đang sử dụng Python 3.

Câu trả lời:


244

Điều này hoạt động trong Python 2.x.

Đối với Python 3 hãy tìm trong các tài liệu :

import urllib.request

with urllib.request.urlopen("http://www.python.org") as url:
    s = url.read()
    # I'm guessing this would output the html source code ?
    print(s)

3
Xin chào Eumiro, sử dụng câu lệnh 'with' trong Python Tôi đoán nó sẽ tự động đóng kết nối sau khi sử dụng xong? Tương tự như một tuyên bố sử dụng trong C #?

@Sergio: chính xác! Và thông qua thụt lề, bạn thấy nơi tập tin của bạn vẫn được mở.
eumiro

Xin chào @eumiro, tôi có lỗi "IndentationError: mong đợi một khối thụt lề" khi tôi nhập s = url.read(), tôi có thể hỏi làm thế nào tôi có thể giải quyết nó được không? x
Karen Chan

@KarenChan bạn đang thiếu một thụt lề trước đó s=url.read(); Bạn đã có 4 không gian trước khi nó?
numbermaniac

19

Một giải pháp tương thích Python 2 + 3 là:

import sys

if sys.version_info[0] == 3:
    from urllib.request import urlopen
else:
    # Not Python 3 - today, it is most likely to be Python 2
    # But note that this might need an update when Python 4
    # might be around one day
    from urllib import urlopen


# Your code where you can use urlopen
with urlopen("http://www.python.org") as url:
    s = url.read()

print(s)

1
with urlopen("http://www.python.org") as url:không hoạt động trong python2 với AttributeError: addinfourl instance has no attribute '__exit__'. Cần viếturl = urlopen("http://www.python.org")
orshachar

15
import urllib.request as ur
s = ur.urlopen("http://www.google.com")
sl = s.read()
print(sl)

Trong Python v3, "urllib.request" là một mô-đun, do đó "urllib" không thể được sử dụng ở đây.


7

Để có được ' dataX = urllib.urlopen (url) .read () ' hoạt động trong python 3 (điều này đã đúng với python 2 ), bạn chỉ cần thay đổi 2 điều nhỏ.

1: Bản thân câu lệnh urllib (thêm .request ở giữa):

dataX = urllib.request.urlopen(url).read()

2: Câu lệnh nhập trước nó (thay đổi từ 'nhập urlib' thành:

import urllib.request

Và nó sẽ hoạt động trong python3 :)


3
import urllib.request as ur

filehandler = ur.urlopen ('http://www.google.com')
for line in filehandler:
    print(line.strip())

1

Đối với python 3, hãy thử một cái gì đó như thế này:

import urllib.request
urllib.request.urlretrieve('http://crcv.ucf.edu/THUMOS14/UCF101/UCF101/v_YoYo_g19_c02.avi', "video_name.avi")

Nó sẽ tải video về thư mục làm việc hiện tại

Tôi đã nhận được sự giúp đỡ từ ĐÂY


1

Giải pháp cho python3:

from urllib.request import urlopen

url = 'http://www.python.org'
file = urlopen(url)
html = file.read()
print(html)

Đơn giản và dễ hiểu cho người mới bắt đầu. Cảm ơn
SHR

1

Thay đổi dòng HAI:

import urllib.request #line1

#Replace
urllib.urlopen("http://www.python.org")
#To
urllib.request.urlopen("http://www.python.org") #line2

Nếu bạn có LRI 403: Ngoại lệ Lỗi Cấm, hãy thử điều này:

siteurl = "http://www.python.org"

req = urllib.request.Request(siteurl, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.100 Safari/537.36'})
pageHTML = urllib.request.urlopen(req).read()

Tôi hy vọng vấn đề của bạn được giải quyết.


0

Một trong những cách có thể để làm điều đó:

import urllib
...

try:
    # Python 2
    from urllib2 import urlopen
except ImportError:
    # Python 3
    from urllib.request import urlopen

0

Sử dụng sáu mô-đun để làm cho mã của bạn tương thích giữa python2python3

urllib.request.urlopen("<your-url>")```

Bạn có thể nhập sáu mô-đun theo cách này từ six.move nhập urllib
Rajat Shukla

0

mã của bạn được sử dụng trong python2.x, bạn có thể sử dụng như thế này:

from urllib.request import urlopen
urlopen(url)

Nhân tiện, đề xuất một mô-đun khác được gọi requestslà thân thiện hơn để sử dụng, bạn có thể sử dụng pipcài đặt nó và sử dụng như thế này:

import requests
requests.get(url)
requests.post(url)

Tôi nghĩ nó dễ sử dụng, tôi cũng mới bắt đầu .... hahah


-1
import urllib
import urllib.request
from bs4 import BeautifulSoup


with urllib.request.urlopen("http://www.newegg.com/") as url:
    s = url.read()
    print(s)
soup = BeautifulSoup(s, "html.parser")
all_tag_a = soup.find_all("a", limit=10)

for links in all_tag_a:
    #print(links.get('href'))
    print(links)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.