我正在python上学习udacity课程,我们应该检查文档中的亵渎词。我正在使用网站http://www.wdylike.appspot.com/?q=(text_to_be_checked_for_profanity)。要检查的文本可以作为上述URL中的查询字符串传递,并且在检查亵渎词后网站将返回true或false。以下是我的代码。
import urllib.request
# Read the content from a document
def read_content():
quotes = open("movie_quotes.txt")
content = quotes.read()
quotes.close()
check_profanity(content)
def check_profanity(text_to_read):
connection = urllib.request.urlopen("http://www.wdylike.appspot.com/?q="+text_to_read)
result = connection.read()
print(result)
connection.close
read_content()
它给我以下错误
Traceback(最近一次调用最后一次):文件 " /Users/Vrushita/Desktop/Rishit/profanity_check.py" ;,第21行,在 read_content()File" /Users/Vrushita/Desktop/Rishit/profanity_check.py" ;,第11行,in read_content check_profanity(content)File" /Users/Vrushita/Desktop/Rishit/profanity_check.py" ;,第16行,in check_profanity connection = urllib.request.urlopen(" http://www.wdylike.appspot.com/?q=" + text_to_read) 文件 " /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py" ;, 第163行,在urlopen中 return opener.open(url,data,timeout)File" /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", 第472行,公开 response = meth(req,response)File" /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", 第582行,在http_response中 ' http',请求,响应,代码,消息,hdrs)文件" /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py" ;, 第510行,错误 return self._call_chain(* args)File" /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", 第444行,在_call_chain中 result = func(* args)File" /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/urllib/request.py", 第590行,在http_error_default中 引发HTTPError(req.full_url,code,msg,hdrs,fp)urllib.error.HTTPError:HTTP错误400:错误请求
我尝试阅读内容的文档包含一个字符串" Hello world "但是,如果我将字符串更改为" Hello + world ",则相同的代码将起作用并返回所需的结果。有人可以解释为什么会发生这种情况以及解决方法是什么?
答案 0 :(得分:6)
urllib
接受它,服务器不接受。好吧它不应该,因为空格不是valid URL character。
使用urllib.parse.quote_plus()
正确转义查询字符串;它不确定你的字符串是valid for use in query parameters。或者更好的是,使用urllib.parse.urlencode()
function对所有键值对进行编码:
from urllib.quote import urlencode
params = urlencode({'q': text_to_read})
connection = urllib.request.urlopen("http://www.wdylike.appspot.com/?" + params)
答案 1 :(得分:3)
以下回复是针对python 3的。* 当输入文本中有空格时,会发生400错误请求。 为了避免这种使用解析。 所以导入它。
from urllib import request, parse
如果您要发送任何文本和网址,则解析文本。
url = "http://www.wdylike.appspot.com/?q="
url = url + parse.quote(input_to_check)
检查此处的说明 - https://discussions.udacity.com/t/problem-in-profanity-with-python-3-solved/227328
Udacity亵渎性检查程序 -
from urllib import request, parse
def read_file():
fhand = open(r"E:\Python_Programming\Udacity\movie_quotes.txt")
file_content = fhand.read()
#print (file_content)
fhand.close()
profanity_check(file_content)
def profanity_check(input_to_check):
url = "http://www.wdylike.appspot.com/?q="
url = url + parse.quote(input_to_check)
req = request.urlopen(url)
answer = req.read()
#print(answer)
req.close()
if b"true" in answer:
print ("Profanity Alret!!!")
else:
print ("Nothing to worry")
read_file()
答案 2 :(得分:0)
我认为这段代码更接近Lesson的目标,推断出类中的本机函数,类和函数之间的区别:
from urllib import request, parse
def read_text():
quotes = open('C:/Users/Alejandro/Desktop/movie_quotes.txt', 'r+')
contents_of_file = quotes.read()
print(contents_of_file)
check_profanity(contents_of_file)
quotes.close()
def check_profanity(text_to_check):
connection = request.urlopen('http://www.wdylike.appspot.com/?q=' + parse.quote(text_to_check))
output = connection.read()
# print(output)
connection.close()
if b"true" in output:
print("Profanity Alert!!!")
elif b"false" in output:
print("This document has no curse words!")
else:
print("Could not scan the document properly")
read_text()
答案 3 :(得分:0)
我也最喜欢使用Python 3在同一个项目上。
在Python 3中寻找解决方案时,我发现了this HowTo,因此决定尝试一下。
在包括Google在内的某些网站上,似乎无法通过编程代码(例如,通过urllib模块)进行连接。显然,这与用户代理有关,在建立连接时网站会收到用户代理。
我做了一些进一步的研究,并提出了以下解决方案:
首先,我从URLopener
导入了urllib.request
,并创建了一个名为ForceOpen
的类作为URLopener
的子类。
现在,我可以通过在version
类中设置变量ForceOpen
来创建“常规”用户代理。然后,仅创建它的一个实例,并使用open
方法代替urlopen
打开URL。
(效果很好,但我仍然感谢您的评论,建议或任何反馈,也因为我不确定,如果这种方法是一种很好的选择,非常感谢)
from urllib.request import URLopener
class ForceOpen(URLopener): # create a subclass of URLopener
version = "Mozilla/5.0 (cmp; Konqueror ...)(Kubuntu)"
force_open = ForceOpen() # create an instance of it
def read_text():
quotes = open(
"/.../profanity_editor/data/quotes.txt"
)
contents_of_file = quotes.read()
print(contents_of_file)
quotes.close()
check_profanity(contents_of_file)
def check_profanity(text_to_check):
# now use the open method to open the URL
connection = force_open.open(
"http://www.wdylike.appspot.com/?q=" + text_to_check
)
output = connection.read()
connection.close()
if b"true" in output:
print("Attention! Curse word(s) have been detected.")
elif b"false" in output:
print("No curse word(s) found.")
else:
print("Error! Unable to scan document.")
read_text()