Python,网页似乎看不到我所有的数据并且不能提供正确的答案?

3
如果我输入这个URL,我会得到一些XML格式的文本作为响应:

http://skrutten.nada.kth.se/scrut/svesve/?text=g%E5&url=&xmlout=on&x=Granska

现在我试着编写一个Python函数,向网页发送POST消息,并应该得到相同的信息。然而,我从网页上获取的信息比较少。似乎有些数据没有被"看到"(文本),但我没有收到任何错误消息。例如,我不确定我是否以正确的方式处理编码(我尝试使用UTF-8,但没有任何区别)。
对于我的错误有什么建议吗?
def fetch_web (name, par1):
    """Fetch the web data defined by name and return a string with the web page"""

    if name == "granska":
        url = "http://skrutten.nada.kth.se/scrut/svesve/"
        values = {"text":par1,"xmlout":"on","x":"Granska","url":""}
        code = "ISO-8859-1"
    data = urllib.parse.urlencode(values)
    data = data.encode(code)

    req = urllib.request.Request(url,data)
    response = urllib.request.urlopen(req)

    page = response.read()
    return page.decode("ISO-8859-1")

print (fetch_web("granska","gå"))
1个回答

3

试试这个

def fetch_web (name, par1):
    """Fetch the web data defined by name and return a string with the web page"""

    if name == "granska":
        url = "http://skrutten.nada.kth.se/scrut/svesve/"
        values = {"text":par1,"xmlout":"on","x":"Granska","url":""}
        code = "ISO-8859-1"

    data = urllib.parse.urlencode(values)
    data = data.encode(code)
    full_url = "%s?%s" % (url, data)

    req = urllib.request.Request(full_url)
    response = urllib.request.urlopen(req)

    page = response.read()
    return page.decode("ISO-8859-1")

print (fetch_web("granska","gå"))

可能由于URL末尾缺少文件名而导致问题。我过去也遇到过几个脚本的同样情况,当URL末尾只有一个斜杠“/”时,它不会在URL和提交数据之间添加“?”。我认为这是urllib2.Request类的一个bug,但由于我找到了一种解决方法,所以一直没有考虑是否存在bug报告。
另外,如果name != "granska",当在data = ...行中使用urlvalues未定义变量时,你将会收到一个异常。

很高兴能够帮忙 :)。如果您能接受这个答案,它会帮助将来遇到这个问题的其他人知道这个解决方案有效。 - chown
你能简单说明一下 full_url 的作用吗?看起来你正在将 url 和 (?) 数据拼接在一起。但是 urllib.request.Request(url,data) 这个语句不应该已经完成了同样的工作吗? - andreSmol
是的,它应该这样做,但我以前在几个脚本中遇到过同样的问题,在URL末尾只有一个斜杠“/”时,它不会在URL和发布数据之间添加“?”。我认为这是一个错误,但自从我找到了解决方法后,我一直拖延着是否存在错误报告的调查。 - chown
好的!我遇到了这个特定网页的问题,但是我已经成功处理了另一个也被 / 终止的网页。 - andreSmol
这可能与Web服务器处理urllib2发送的请求有关。我不确定urllib2是否实际上在标头中发送POST数据,还是将其添加到URL字符串中。不同的服务器可能以不同的方式处理它,这可以解释不一致的行为。 - chown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接