2016-12-31 3 views
1

Selon ce code ci-dessous, j'ai enregistré le numéro de demande de tirage dans un fichier texte et je veux les télécharger sur l'url qui se trouve dans mon code mais j'ai l'erreur mentionnée dans le Titre.urllib2.URLError: erreur urlopen aucun hôte donné

import urllib2 
import json 
import httplib 
def event_spider(org,repo): 
    try: 
     nbPrequest_reopened=0 #number of pull requests reopened 
     pages=1 
     while pages<=3: 
      headers={'User-Agent':'Mozilla/5.0(X11;Linux i686)', 
       'Authorization':'token 516ed78e0521c6b25d9726ad51fa63841d019936',} 
      read_file=open('C:\Python27\pullRequest_number.txt','r+') 
      rf=read_file.readlines() 
      for number in rf: 
       url_event=('https://api.github.com/repos/'+ org +'/'+ repo + '/issues/'+ str(number) +'/events?per_page=99&state=all&page='+str(pages)) 
       event_Request=urllib2.Request(url_event,headers=headers) 
       eventObject=urllib2.urlopen(event_Request) 
       eventData=json.load(eventObject) 
       for element in eventData: 
        if element['event']=='reopened': 
         nbPrequest_reopened+=1 
       #print url_event 
      pages+=1 
    except httplib.BadStatusLine: 
     pass 
    print 'The number of pull request reopened is %s ' %(nbPrequest_reopened) 
if __name__=='__main__': 
    event_spider('rails','rails') 

retraçage (le plus récent appel dernier):

File "C:/Users/ABDILLAH/PycharmProjects/Pandas_data_analysis/event_spider.py", line 27, in <module> 
    event_spider('rails','rails') 
    File "C:/Users/ABDILLAH/PycharmProjects/Pandas_data_analysis/event_spider.py", line 16, in event_spider 
    eventObject=urllib2.urlopen(event_Request) 
    File "C:\Python27\lib\urllib2.py", line 154, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Python27\lib\urllib2.py", line 427, in open 
    req = meth(req) 
    File "C:\Python27\lib\urllib2.py", line 1126, in do_request_ 
    raise URLError('no host given') 
urllib2.URLError: <urlopen error no host given> 

quelqu'un peut me aider à résoudre ce problème? Merci.

+1

Avez-vous vérifié l'URL générée? Est-il valide? – jophab

+0

chaque ligne du fichier peut se terminer par un caractère de nouvelle ligne "\ n". Donc votre numéro lu à partir de filw peut avoir un \ n à la fin. Cela causera l'url invalide – jophab

Répondre

0

Le problème est de prendre l'entrée du fichier.

read_file.readlines() renvoie une liste qui contient toutes les lignes du fichier avec un caractère de retour à la ligne à la fin de chaque ligne.

Lorsque vous créez l'URL en utilisant,

url_event=('https://api.github.com/repos/'+ org +'/'+ repo + 
'/issues/'+ str(number) +.....) 

Ici number subirai une \n à la fin.

Par conséquent, l'URL générée ne sera pas correcte.

Une meilleure approche est la suivante

Lire le fichier entier et des lignes séparées à l'aide str.splitlines

rf = read_file.read().splitlines() 

En utilisant splitlines() vous obtiendrez la liste des lignes dans le fichier sans \n à la fin.

Donc, il n'y aura pas le problème ci-dessus avec number

+0

Merci beaucoup. Problème résolu –

+0

Cher jophab, pouvez-vous m'expliquer d'une autre manière parce que je ne vous comprends pas? –

+0

Oui s'il vous plaît jophab –

1

Il y a une solution facile pour cela. Je l'ai pris de https://github.com/rg3/youtube-dl/pull/11892/files (projet youtube-dl avait aussi ce problème).

Correction dans pytube sera comme ça (je vais essayer de télécharger une demande de traction par aujourd'hui): Dans le fichier api.py, vous devez modifier 2 lignes de code. Tout d'abord, sous la fonction _get_cipher vous devez changer la ligne:

reg_exp = re.compile(r'\.sig\|\|([a-zA-Z0-9$]+)\(') 

à:

reg_exp = re.compile(r'"signature",\s?([a-zA-Z0-9$]+)\(') 

En second lieu, sous la fonction URL_Depuis vous devez modifier cette ligne:

js_url = "http:" + video_data.get("assets", {}).get("js") 

à cette code:

js_url = '' js_partial_url = video_data.get("assets", {}).get("js") 
if js_partial_url.startswith('//'): 
    js_url = 'http:' + js_partial_url 
elif js_partial_url.startswith('/'): 
    js_url = 'https://youtube.com' + js_partial_url 
+0

Il manque un saut de ligne dans la première ligne de la dernière liste de codes. 'js_url = ''' [nouvelle ligne] 'js_partial_url = video_data.get (" assets ", {}). Get (" js ")' – GuillaumeDufay