从URL读取HTML时,Python有时会返回奇怪的结果

时间:2015-10-24 09:58:58

标签: python html url

我创建了一个从特定网址读取HTML内容的函数。这是代码:

def __retrieve_html(self, address):
    html = urllib.request.urlopen(address).read()
    Helper.log('HTML length', len(html))
    Helper.log('HTML content', html)
    return str(html)

但是该函数并不总是返回正确的字符串。在某些情况下,它会返回一个非常长的奇怪字符串。

例如,如果我使用URL:http://www.merdeka.com,有时会提供正确的html字符串,但有时也会返回如下结果:

HTML content: b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\xfdyW\x1c\xb7\xd28\x8e\xffm\x9f\x93\xf7\xa0;y>\xc1\xbeA\xcc\xc2b\x03\x86\x1cl\xb0\x8d1\x86\x038yr\......Very long and much more characters.

似乎只会在包含大量内容的任何网页中发生。对于像Facebook.com登录页面和Google.com索引这样的简单页面,它从未发生过。这是什么?我的错误在哪里以及如何处理?

2 个答案:

答案 0 :(得分:1)

你有字节而不是字符串,因为urrlib无法为你解码响应。这可能是因为某些网站在其内容类型标题中省略了编码声明。

例如,google.com有:

  

Content-Type:text / html;字符集= UTF-8

那个http://www.merdeka.com网站只有:

  

内容类型:text / html

因此,您需要手动解码响应,例如使用utf-8编码

html = urllib.request.urlopen(address).read().decode('utf-8')

问题是你需要设置正确的编码,如果它不在服务器头中,你需要以某种方式猜测它。

有关详情,请参阅此问题How to handle response encoding from urllib.request.urlopen()

PS:考虑从有些弃用的urllib移动到requests lib。它在这个时候更简单,更时尚,更性感:)

答案 1 :(得分:1)

来自1 Normal Form的响应似乎是经过压缩压缩的。

尝试一下:

import gzip
import urllib.request
def __retrieve_html(self, address):
    with urllib.request.urlopen(address) as resp:
        html = resp.read()
        Helper.log('HTML length', len(html))
        Helper.log('HTML content', html)
        if resp.info().get('Content-Encoding') == 'gzip':
            html = gzip.decompress(html)
        return html

如何解码您的html对象,我将此作为练习留给您。

或者,您可以使用“请求”模块:http://www.merdeka.com

使用以下命令安装:

pip install requests

然后执行:

import requests
r = requests.get('http://www.merdeka.com')
r.text

来自http://docs.python-requests.org/en/latest/

的回复似乎没有任何问题