2012-10-24 16 views
5

Ho importato due librerie urllib e from urllib.request import urlopen.python urllib usage

Il secondo è contenuto nel primo

Quando sono andato sul codice e ho cercato di rimuovere la linea from urllib.request import urlopen, ho ricevuto questo messaggio:

opnerHTMLnum = urllib.request.build_opener() 
AttributeError: 'module' object has no attribute 'request' 

Quando ho ripristinare la linea from urllib.request import urlopen il codice corre.

Qualcuno può spiegare perché?

import re 
#import http.cookiejar 
import os.path 
#import time 
#import urllib3 
import urllib 
from urllib.request import urlopen 
import sys 
import smtplib 
from email.mime.text import MIMEText 

# ... 

    opnerHTMLnum = urllib.request.build_opener() 
+1

'da urllib.request urlopen' importazione dà ' ImportError: No module named request' su Python 2.7. Quale versione di Python stai usando? – utapyngo

risposta

2

Il pacchetto urllib è proprio questo, un pacchetto. È __init__.py non importa urllib.request e quindi non puoi semplicemente raggiungere urllib.request importando solo urllib. È inteso solo come spazio dei nomi.

Import urllib.request invece.

2

Entrambe import X e from X import Y eseguono un'importazione di qualsiasi modulo o pacchetto X fornito.

In questo caso, urllib è un pacchetto. Quando si import urllib, il pacchetto stesso viene importato e si ottiene un riferimento ad esso, ma i sottomoduli non vengono importati (in questo caso). Quando esegui from urllib.request import ..., Python importa effettivamente l'intero modulo urllib.request, ma poi seleziona i nomi che hai richiesto e ti fornisce riferimenti.

Se non si utilizza urlopen, allora si potrebbe facilmente fare anche import urllib.request e ottenere lo stesso risultato.

7

Si sta confondendo il pacchetto python3 urllib.request con Python2.7 uno che è urllib2. Per favore, non farlo. Python3 e Python2 sono librerie differenti. Tutto ciò che può essere utile è urllib2 da python2

import urllib2 
from urllib2 import Request 
req = Request("yoururl") 
res = urllib2.urlopen(req) 
+0

Penso che l'OP sia confuso con i tag; se fosse davvero su Python 2.7, ci sarebbe stato un errore di importazione, non il comportamento indicato nella domanda. –

+0

sì, vero. è taggato erroneamente. –

+0

Buona cattura, stavo seguendo questo esempio: http://www.nltk.org/book/ch03.html e non avevo realizzato gli esempi riferiti a python3. Il mio ambiente è Python 2.7. +1 votato, grazie! – markc

Problemi correlati