2016-06-30 26 views
1

Ich probierte alle 'User-Agent' in here, immer noch bekomme ich urllib.error.HTTPError: HTTP Error 400: Bad Request. Ich habe auch versucht this, aber ich bekomme urllib.error.URLError: File Not Found. Ich habe keine Ahnung, was zu tun ist, meine aktuellen Codes sind;Urlib schlechte Anfrage Ausgabe

from bs4 import BeautifulSoup 
import urllib.request,json,ast 

with open ("urller.json") as f: 
    cc = json.load(f) #the file I get links, you can try this link instead of this 
    #cc = ../games/index.php?g_id=23521&game=0RBITALIS 

for x in ast.literal_eval(cc): #cc is a str(list) so I have to convert 
    if x.startswith("../"): 

     r = urllib.request.Request("http://www.game-debate.com{}".format(x[2::]),headers={'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'}) 
     #x[2::] because I removed '../' parts from urlls 

     rr = urllib.request.urlopen(r).read() 
     soup = BeautifulSoup(rr) 

     for y in soup.find_all("ul",attrs={'class':['devDefSysReqList']}): 
      print (y.text) 

bearbeiten: Wenn Sie versuchen, nur 1 Link wahrscheinlich wird es keine Fehler zeigen, da ich den Fehler jedes Mal bei der 6. Link.

+0

Müssen Sie 'urllib' verwenden? Ich habe gerade 'requests.get (" http://www.game-debate.com/games/index.php?g_id=23521&game=0RBITALIS ") versucht und es funktioniert perfekt. "Anfragen" sind in fast jeder Hinsicht weit überlegen. –

+0

@AkshatMahajan, aber ich habe die Frage bearbeitet, wenn Sie nur 1 Link wahrscheinlich versuchen, wird es in Ordnung sein, da ich diese schlechte Anfrage Fehler jedes Mal bei 6. Link von JSON-Datei erhalten – GLHF

+0

Haben Sie versucht, jede URL vor der Anfrage zu drucken? Vielleicht ist die URL in irgendeiner offensichtlichen Weise falsch formatiert. –

Antwort

1

Eine schnelle Lösung ist es, den Raum mit + zu ersetzen:

url = "http://www.game-debate.com" 
r = urllib.request.Request(url + x[2:] ,headers={'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'}) 

Eine bessere Option lassen urllib quote sein können die params:

from bs4 import BeautifulSoup 
import urllib.request,json,ast 
from urllib.parse import quote, urljoin 

with open ("urller.json") as f: 
    cc = json.load(f) #the file I get links, you can try this link instead of this 
    url = "http://www.game-debate.com" 


    for x in ast.literal_eval(cc): # cc is a str(list) so I have to convert 
     if x.startswith("../"): 
      r = urllib.request.Request(urljoin(url, quote(x.lstrip("."))), headers={ 
       'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'}) 

      rr = urllib.request.urlopen(r).read() 
      soup = BeautifulSoup(rr) 
      print(rr.decode("utf-8")) 

      for y in soup.find_all("ul", attrs={'class':['devDefSysReqList']}): 
       print (y.text) 

Spaces in einer URL sind nicht gültig und müssen als codiert oder durch + ersetzt werden.