AttributeError: l'objet 'module' n'a pas d'attribut 'urlopen'


146

J'essaie d'utiliser Python pour télécharger le code source HTML d'un site Web mais je reçois cette erreur.

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'

Je suis le guide ici: 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)

J'utilise Python 3.

Réponses:


246

Cela fonctionne dans Python 2.x.

Pour Python 3, regardez dans la documentation :

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
Salut Eumiro, en utilisant l'instruction «avec» en Python, je suppose que cela ferme automatiquement la connexion une fois qu'il a fini de l'utiliser? Similaire à une instruction use en C #?

@Sergio: exactement! Et grâce à l'indentation, vous voyez où votre fichier est encore ouvert.
eumiro

Bonjour @eumiro, j'ai une erreur de "IndentationError: attend un bloc indenté" lorsque je tape s = url.read(), puis-je demander comment puis-je le résoudre s'il vous plaît? x
Karen Chan

@KarenChan il vous manque un retrait avant s=url.read(); avez-vous 4 espaces avant?
numbermaniac

19

Une solution compatible Python 2 + 3 est:

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:ne fonctionne pas en python2 avec AttributeError: addinfourl instance has no attribute '__exit__'. Besoin d'écrireurl = urlopen("http://www.python.org")
orshachar

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

Dans Python v3, "urllib.request" est un module en lui-même, donc "urllib" ne peut pas être utilisé ici.


7

Pour que ' dataX = urllib.urlopen (url) .read () ' fonctionne en python 3 (cela aurait été correct pour python 2 ), vous devez simplement changer 2 petites choses.

1: l' instruction urllib elle-même (ajoutez le .request au milieu):

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

2: l' instruction d'importation qui la précède (passer de 'import urlib' à:

import urllib.request

Et cela devrait fonctionner en python3 :)


3
import urllib.request as ur

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

1

Pour python 3, essayez quelque chose comme ceci:

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

Il téléchargera la vidéo dans le répertoire de travail actuel

J'ai eu de l'aide ICI


1

Solution pour python3:

from urllib.request import urlopen

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

Simple et facile à comprendre pour les débutants. Merci
SHR

1

Changer DEUX lignes:

import urllib.request #line1

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

Si vous obtenez ERROR 403: exception d'erreur interdite, essayez ceci:

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

J'espère que votre problème est résolu.


0

Une des manières possibles de le faire:

import urllib
...

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

0

Utilisez six modules pour rendre votre code compatible entre python2 et python3

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

Vous pouvez importer six modules de cette façon à partir de six.moves import urllib
Rajat Shukla

0

votre code utilisé dans python2.x, vous pouvez utiliser comme ceci:

from urllib.request import urlopen
urlopen(url)

en passant, suggérez qu'un autre module appelé requestsest plus convivial à utiliser, vous pouvez l'utiliser pour l' pipinstaller et l'utiliser comme ceci:

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

Je pensais que c'était facile à utiliser, je suis aussi débutant .... 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)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.