我想获取给定网址的html源代码。我曾尝试过使用这个
import urllib2
url = 'http://mp3.zing.vn' # write the url here
usock = urllib2.urlopen(url)
data = usock.read()
usock.close()
print data
但是某些页面的返回数据不是HTML格式。我尝试使用另一个链接,如http://phuctrancs.info
,它的工作原理(因为这个页面是基于纯HTML的)。我也尝试使用BeautifulSoup
库,但它也不起作用。有什么建议吗?
答案 0 :(得分:2)
您获得了预期的HTML,但压缩。我手动尝试了这个URL,并在标题中找到了二进制混乱:
Content-Encoding: gzip
我将响应正文保存到文件中,并且能够在命令行上gunzip
。您还应该能够使用标准库zlib
module中的函数在程序中解压缩它。
zlib.decompress
... 问题的人,更新
您将获得的压缩数据(或至少在Python 2.6中获得的 I )显然具有" gzip标头和预告片"像你在*.gz
文件中所期望的那样,而zlib.decompress
期望一个" zlib包装器......可能。我一直得到一个无用的zlib.error
例外:
Traceback (most recent call last):
File "./fixme.py", line 32, in <module>
text = zlib.decompress(data)
zlib.error: Error -3 while decompressing data: incorrect header check
解决方案在Python标准库中完全未记录,但可以在Greg Hewgill's answer中找到有关gzip
个流的问题:您必须提供{ {1}} zlib.decompress
参数,通过向未记录的模块级常量&lt; grumble , mutter 添加幻数来创建。 &GT;:
wbits
如果你觉得这并没有足够的混淆,请注意text = zlib.decompress(data, 16 + zlib.MAX_WBITS)
这里的32
与16
一样神奇。
唯一的暗示隐藏在deflateInit2
函数下的original zlib's manual:
对于可选的 gzip 解码,
windowBits
也可以大于15。将{16}添加到windowBits
以编写一个简单的 gzip 标头并预览压缩数据,而不是 zlib 包装。
...和inflateInit2
函数:
对于可选的 gzip 解码,
windowBits
也可以大于15 。添加32到windowBits
以使用自动标头检测启用 zlib 和 gzip 解码,或添加16以仅解码 gzip 格式 [...]
请注意,zlib.decompress
docs明确告诉您无法执行此操作:
因此,默认值为最高值,15 。
但这是......与真实相反。
&lt; fume ,诅咒, rant ...&gt;
答案 1 :(得分:1)
让你查看响应代码,urllib2可能需要你处理301重定向等响应。 你应该打印响应代码,如:
data = usock.read()
if usock.getcode() != 200:
print "something unexpected"
更新: 如果响应包含无本地化或不可读的文本,则可能需要在请求标头中指定请求字符集。
import cookielib
cookie = cookielib.CookieJar()
opener = urllib2.opener(urllib2.HTTPCookieProcessor(cookie))
opener.addheaders = [("Content-type: text/html; charset=UTF-8")]
urllib2.install_opener(opener)
PS:未经测试。
答案 2 :(得分:0)
使用来自python的美丽的汤
import request
from bs4 import BeautifulSoup
url = 'http://www.google.com'
r=request.get(url)
b=BeautifulSoup(r.text)
b将包含所有html标记,并且还为迭代器提供遍历元素/标记。要了解更多链接,请https://pypi.python.org/pypi/beautifulsoup4/4.3.2