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.

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)

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)

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í.


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


3
import urllib.request as ur

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

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Í


1

Solución para python3:

from urllib.request import urlopen

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

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.


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

0

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

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

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


-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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.