2015-10-24 22 views
0

我创建了一个函数来读取特定网址的HTML内容。这里是代码:Python有时返回奇怪的结果当从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) 

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

例如,如果我使用的网址: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索引这样的简单页面,它从未发生过。这是什么?我的错误在哪里以及如何处理?

回答

1

看起来http://www.merdeka.com的响应是gzipped压缩。

试试这个:

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对象进行解码,我离开作为练习给你。

或者,你可以只使用请求模块:

与安装:

pip install requests 

然后执行类似:

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

请求并未有任何麻烦与从http://www.merdeka.com

+0

是的,它的工作原理。你是对的先生。谢谢! – yunhasnawa

1

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

例如,google.com具有:

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

http://www.merdeka.com网站刚:

的Content-Type:text/html的

所以,你需要手动解码的反应,例如用UTF-8编码

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

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

看到这个问题的更多信息How to handle response encoding from urllib.request.urlopen()

PS:考虑从有点过时urllibrequests LIB移动。它在这个时候更简单,更时尚,更性感:)

+0

的回应显然它是t该问题归因于gzip-ed文本。无论如何,谢谢你的建议,先生。 – yunhasnawa