AttributeError: el objeto 'módulo' no tiene el atributo 'urlopen'

146

Estoy tratando de usar Python para descargar el código fuente HTML de un sitio web, pero recibo este error.

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'

Estoy siguiendo la guía aquí: 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)

Estoy usando Python 3.

pppery
fuente

Respuestas:

245

Esto funciona en Python 2.x.

Para Python 3 mira en los documentos :

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
fuente
3
Hola Eumiro, usando la declaración 'con' en Python, supongo que cierra la conexión automáticamente una vez que termina de usarla. ¿Similar a una declaración de uso en C #?
@ Sergio: ¡exactamente! Y a través de la sangría, verá dónde todavía está abierto su archivo.
eumiro
Hola @eumiro, tengo un error de "IndentationError: esperaba un bloque sangrado" cuando escribo, ¿ s = url.read()puedo preguntar cómo puedo resolverlo, por favor? x
Karen Chan
@KarenChan te estás perdiendo una sangría antes s=url.read(); ¿Tienes 4 espacios antes?
numbermaniac
19

Una solución compatible con Python 2 + 3 es:

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
fuente
1
with urlopen("http://www.python.org") as url:no funciona en python2 con AttributeError: addinfourl instance has no attribute '__exit__'. Necesito escribirurl = urlopen("http://www.python.org")
orshachar
15
import urllib.request as ur
s = ur.urlopen("http://www.google.com")
sl = s.read()
print(sl)

En Python v3, "urllib.request" es un módulo en sí mismo, por lo tanto, "urllib" no se puede usar aquí.

Manu Mariaraj
fuente
7

Para que ' dataX = urllib.urlopen (url) .read () ' funcione en python 3 (esto habría sido correcto para python 2 ) solo debe cambiar 2 pequeñas cosas.

1: La declaración urllib en sí misma (agregue la solicitud. En el medio):

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

2: La declaración de importación que le precede (cambie de 'import urlib' a:

import urllib.request

Y debería funcionar en python3 :)

Steven B. Peutz
fuente
3
import urllib.request as ur

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

Para python 3, intente algo como esto:

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

Descargará el video al directorio de trabajo actual

Recibí ayuda de AQUÍ

Rocksyne
fuente
1

Solución para python3:

from urllib.request import urlopen

url = 'http://www.python.org'
file = urlopen(url)
html = file.read()
print(html)
Banjali
fuente
Simple y fácil de entender para principiantes. Gracias
SHR
1

Cambiar DOS líneas:

import urllib.request #line1

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

Si obtuvo ERROR 403: excepción de error prohibido intente esto:

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

Espero que tu problema se haya resuelto.

Shahzaib Chadhar
fuente
0

Una de las posibles formas de hacerlo:

import urllib
...

try:
    # Python 2
    from urllib2 import urlopen
except ImportError:
    # Python 3
    from urllib.request import urlopen
Vasyl Lyashkevych
fuente
0

Use seis módulos para que su código sea compatible entre python2 y python3

urllib.request.urlopen("<your-url>")```
Rajat Shukla
fuente
Puede importar seis módulos de esta manera desde six.moves import urllib
Rajat Shukla
0

su código usado en python2.x, puede usarlo así:

from urllib.request import urlopen
urlopen(url)

por cierto, sugiera que otro módulo llamado requestssea ​​más fácil de usar, puede usar pipinstalarlo y usarlo así:

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

Pensé que es fácil de usar, yo también soy principiante ... jaja

jason.lu
fuente
-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)
usuario11649630
fuente