如何从返回“垃圾”数据的URL获取HTML?

时间:2015-02-09 03:44:36

标签: python html

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

3 个答案:

答案 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) 这里的3216一样神奇。

唯一的暗示隐藏在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