AttributeError: obiekt „module” nie ma atrybutu „urlopen”

146

Próbuję użyć języka Python do pobrania kodu źródłowego HTML witryny sieci Web, ale otrzymuję ten błąd.

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'

Podążam za przewodnikiem tutaj: 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)

Używam Pythona 3.

pppery
źródło

Odpowiedzi:

245

Działa to w Pythonie 2.x.

W przypadku Pythona 3 zajrzyj do dokumentacji :

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)
eumiro
źródło
3
Cześć Eumiro, używając instrukcji „with” w Pythonie, zgaduję, że automatycznie zamyka połączenie po zakończeniu korzystania z niego? Podobne do instrukcji użycia w C #?
@Sergio: dokładnie! Przez wcięcie widać, gdzie plik jest nadal otwarty.
eumiro
Witaj @eumiro, mam błąd „IndentationError: oczekiwano wciętego bloku” podczas pisania s = url.read(), czy mogę zapytać, jak mogę go rozwiązać? x
Karen Chan
@KarenChan, wcześniej brakuje ci wcięcia s=url.read() ; czy masz przed nim 4 spacje?
numbermaniac
19

Rozwiązanie kompatybilne z Python 2 + 3 to:

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)
Martin Thoma
źródło
1
with urlopen("http://www.python.org") as url:nie działa w python2 z AttributeError: addinfourl instance has no attribute '__exit__'. Trzeba napisaćurl = urlopen("http://www.python.org")
orshachar
15
import urllib.request as ur
s = ur.urlopen("http://www.google.com")
sl = s.read()
print(sl)

W Pythonie v3 „urllib.request” jest modułem samym w sobie, dlatego „urllib” nie może być tutaj użyte.

Manu Mariaraj
źródło
7

Aby uzyskać ` ` dataX = urllib.urlopen (url) .read () '' działające w Pythonie 3 (byłoby to poprawne dla Pythona 2 ) , wystarczy zmienić 2 małe rzeczy.

1: Sama instrukcja urllib (dodaj .request w środku):

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

2: poprzedzająca ją instrukcja importu (zmiana z 'import urlib' na:

import urllib.request

I powinno działać w pythonie3 :)

Steven B. Peutz
źródło
3
import urllib.request as ur

filehandler = ur.urlopen ('http://www.google.com')
for line in filehandler:
    print(line.strip())
Kamran
źródło
1

W przypadku Pythona 3 spróbuj czegoś takiego:

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

Pobierze wideo do bieżącego katalogu roboczego

Otrzymałem pomoc TUTAJ

rocksyne
źródło
1

Rozwiązanie dla Python3:

from urllib.request import urlopen

url = 'http://www.python.org'
file = urlopen(url)
html = file.read()
print(html)
Banjali
źródło
Prosty i łatwy do zrozumienia dla początkujących. Dzięki
SHR
1

Zmień DWIE linie:

import urllib.request #line1

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

Jeśli otrzymałeś błąd 403: wyjątek zabroniony błąd, spróbuj tego:

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()

Mam nadzieję, że problem został rozwiązany.

Shahzaib Chadhar
źródło
0

Jeden z możliwych sposobów:

import urllib
...

try:
    # Python 2
    from urllib2 import urlopen
except ImportError:
    # Python 3
    from urllib.request import urlopen
Wasyl Lyashkevych
źródło
0

Użyj sześciu modułów, aby zapewnić zgodność kodu między python2 i python3

urllib.request.urlopen("<your-url>")```
Rajat Shukla
źródło
W ten sposób możesz zaimportować sześć modułów z six.moves import urllib
Rajat Shukla
0

twój kod używany w python2.x, możesz użyć w ten sposób:

from urllib.request import urlopen
urlopen(url)

przy okazji zasugeruj, że inny moduł o nazwie requestsjest bardziej przyjazny w użyciu, możesz go pipzainstalować i używać w ten sposób:

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

Myślałem, że jest łatwy w użyciu, ja też jestem początkującym… hahah

jason.lu
źródło
-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)
user11649630
źródło