urlib.request.urlopen不接受带空格

时间:2016-12-18 17:32:44

标签: python python-3.x

我正在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 ",则相同的代码将起作用并返回所需的结果。有人可以解释为什么会发生这种情况以及解决方法是什么?

4 个答案:

答案 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()