I keep getting HTTP Error 400: Bad Request from urlopen

I'm studying Python from Udacity cause I use different version so I get stuck in programming profanity editor

This is my code:

import urllib.request
def readdocument(x):
    document = open(x)
    profanitycheck(document.read())
    document.close()
def profanitycheck(urcontent):
    q = urllib.request.Request("http://www.wdylike.appspot.com/?q="+urcontent)
    with urllib.request.urlopen(q) as content2:
        output = content2.read()
        print(output)

filelocate=(r"C:\Users\Sutthikiat\Desktop\movie_quotes.txt")   
readdocument(filelocate)

this is txt file:

-- Houston, we have a problem. (Apollo 13)

-- Mama always said, life is like a box of chocolates. You never know what you are going to get. (Forrest Gump)

-- You cant handle the truth. (A Few Good Men)

-- I believe everything and I believe nothing. (A Shot in the Dark)

but I create a new text file and check with it, It runs properly so I don't understand how my code gets error, maybe it's about exception??

this is error code:

Traceback (most recent call last):
  File "C:\Users\Sutthikiat\Desktop\cursecheck.py", line 13, in <module>
readdocument(filelocate)
  File "C:\Users\Sutthikiat\Desktop\cursecheck.py", line 4, in readdocument
profanitycheck(document.read())
  File "C:\Users\Sutthikiat\Desktop\cursecheck.py", line 8, in profanitycheck
with urllib.request.urlopen(q) as content2:
  File "C:\Users\Sutthikiat\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
  File "C:\Users\Sutthikiat\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 532, in open
response = meth(req, response)
  File "C:\Users\Sutthikiat\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
  File "C:\Users\Sutthikiat\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 570, in error
return self._call_chain(*args)
  File "C:\Users\Sutthikiat\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
  File "C:\Users\Sutthikiat\AppData\Local\Programs\Python\Python36\lib\urllib\request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request

Upvotes: 0

Views: 10140

Answers (1)

Cheney
Cheney

Reputation: 980

the server think it invalid,just like this

urllib.request.urlopen("https://www.baidu.com/s?wd="+"a\nb")

the url contains invalid character: \n (just like content you read from file). You need to quote them:

from urllib.quote import quote
q = urllib.request.urlopen("https://www.baidu.com/s?wd="+ urllib.request.quote("a\nb")) 
print(q.url)
'https://www.baidu.com/s?wd=a%0Ab'

Upvotes: 3

Related Questions