почему я продолжаю иметь ту же ошибку в этом коде - PullRequest
0 голосов
/ 24 сентября 2018

Я изучаю учебный курс. Я пытаюсь создать веб-приложение на языке Python 3.7, которое проверяет, есть ли в текстовом файле плохие слова.

текстовый файл содержит следующий текст:

- Хьюстон, у нас проблема.(Аполлон 13)

- Мама всегда говорила, жизнь похожа на коробку конфет.Вы никогда не знаете, что вы собираетесь получить.(Форрест Гамп)

- Вы не можете справиться с правдой.(Несколько хороших людей)

- Я верю всему и ничему не верю.(Выстрел в темноте)

import urllib.request

def read_text():
    quotes = open (r'C:\Users\M\Desktop\TEMP FILES\movie_quotes.txt')
    content_of_file = quotes.read()
    print(content_of_file)
    quotes.close()
    check_profanity(content_of_file)

def check_profanity(text):

    connection = urllib.request.urlopen( 'http://www.wdylike.appspot.com/?q='+text)
   output = connection.read()
   print(output)
   connection.close()

read_text()

и у меня есть эта ошибка:

Traceback (most recent call last):
File "C:\Users\Mosa Abbas\Desktop\TEMP FILES\ipnd-starter-code-master\ipnd-starter-code-master\stage_3\lesson_3.3_classes\c_profanity_editor\check_profanity.py", line 32, in <module>
read_text()
File "C:\Users\Mosa Abbas\Desktop\TEMP FILES\ipnd-starter-code-master\ipnd-starter-code-master\stage_3\lesson_3.3_classes\c_profanity_editor\check_profanity.py", line 23, in read_text
check_profanity(content_of_file)
File "C:\Users\Mosa Abbas\Desktop\TEMP FILES\ipnd-starter-code-master\ipnd-starter-code-master\stage_3\lesson_3.3_classes\c_profanity_editor\check_profanity.py", line 27, in check_profanity
connection = urllib.request.urlopen( 'http://www.wdylike.appspot.com/?q='+text)
File "C:\Users\Mosa Abbas\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "C:\Users\Mosa Abbas\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 531, in open
response = meth(req, response)
File "C:\Users\Mosa Abbas\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 641, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Users\Mosa Abbas\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 569, in error
return self._call_chain(*args)
File "C:\Users\Mosa Abbas\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain
result = func(*args)
File "C:\Users\Mosa Abbas\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 649, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request

что это за ошибка и что я должен сделать, чтобы избавиться от нее

urllib.error.HTTPError: Ошибка HTTP 400: неправильный запрос

Я пытался добавить эту строку кода:

url = 'http://www.wdylike.appspot.com/?q='+urllib.parse.quote(text, safe = '/')

, а затем:

connection = urllib.request.urlopen(url)

и я получил

 raise RemoteDisconnected("Remote end closed connection without"
 http.client.RemoteDisconnected: Remote end closed connection without response

Я новичок в Python и программировании веб-приложений, поэтому, пожалуйста, помогите :(

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я нашел решение, которое, как мне кажется, происходит потому, что я не кодирую строку перед добавлением ее в URL.

в python3, мы должны сделать следующее для 'text' перед добавлением его в URL:

text_to_check = urllib.parse.quote_plus(text)

Python2 будет выглядеть примерно так

(urllib был разбит на более мелкие компоненты в python3):

text_to_check = urllib.quote_plus(text_to_check)

Это означаетчто при добавлении строки с пробелом к ​​URL-адресу она будет выглядеть как «Am + I + cursing% 3F» вместо «Я проклинаю?».

Полный пример check_profanity ():

def check_profanity(text_to_check):
    text_to_check = urllib.parse.quote_plus(text_to_check)
    connection = urlopen(
        "http://www.wdylike.appspot.com/?q=" + text_to_check)
    output = connection.read()
print(output)
connection.close()
0 голосов
/ 24 сентября 2018

При отправке HTTP-запроса через метод GET необходимо экранировать переменные GET.Поэтому вам, вероятно, следует экранировать свой текст перед добавлением его в URL.

Посмотрите на вопрос # 1695183

...