gpt4 book ai didi

python - 如何从返回 "junk"数据的URL获取HTML?

转载 作者:行者123 更新时间:2023-11-30 23:15:11 26 4
gpt4 key购买 nike

我想获取给定url的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 库,但它也不起作用。有什么建议吗?

最佳答案

您得到了预期的 HTML,但它已被压缩。我手动尝试了这个 URL,并在标题中得到了一个二进制困惑的结果:

Content-Encoding: gzip

我将响应正文保存到文件中,并能够在命令行上gunzip它。您还应该能够使用标准库 zlib module 中的函数在程序中解压缩它。 .

更新给任何遇到 zlib.decompress 问题的人...

您将获得的压缩数据(或者至少是在Python 2.6中获得的)显然有一个“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 流的问题:您必须提供 zlib.decompress 一个 wbits 参数,该参数是通过添加魔数(Magic Number)到未记录的模块级常量 <grumblemutter...>:

text = zlib.decompress(data, 16 + zlib.MAX_WBITS)

如果您觉得这还不够模糊,请注意这里的 3216 一样神奇。

唯一的暗示隐藏在 original zlib's manual 中,在 deflateInit2 函数下:

windowBits can also be greater than 15 for optional gzip decoding. Add 16 to windowBits to write a simple gzip header and trailer around the compressed data instead of a zlib wrapper.

...以及 inflateInit2 函数:

windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format [...]

请注意 zlib.decompress docs明确告诉您不能这样做:

The default value is therefore the highest value, 15.

但这……与事实相反。

<发怒咒骂咆哮...>

关于python - 如何从返回 "junk"数据的URL获取HTML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28402483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com