2015-02-09 78 views
1

我想获取给定url的html源代码。我曾尝试过使用此方法如何从返回“垃圾”数据的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库,但它也没有工作。任何建议?

+0

我试过你放的脚本,它的工作原理。你能具体说明哪些页面不是HTML格式吗? – tabchas 2015-02-09 03:49:06

+0

我尝试过'url ='http:// mp3.zing.vn',并且返回的数据可能是 加密的。 – 2015-02-09 03:51:32

回答

2

你得到你所期望的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说法,通过将幻数到一个未记录的模块级恒定< 创建...>:

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

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

的这个唯一的提示被掩埋在original zlib's manual,将deflateInit2作用下:

windowBits也可以是大于15用于可选gzip的解码。添加16到windowBits来写一个简单的gzip头和尾部围绕压缩数据而不是zlib包装。

...和inflateInit2功能:

windowBits也可以大于15可选gzip的解码。添加32 windowBits使zlib的的gzip自动头部检测解码,或增加16只解码的gzip格式 [...]

注意,zlib.decompress docs明确地告诉你你无法做到这一点:

默认值为因此最高值,15

但这是......与真的相反。

< 油烟诅咒咆哮 ...>

+0

谢谢!有用 – 2015-02-09 05:00:48

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:未经测试。

+0

我认为你还没有得到我的问题。给定的页面可以访问('getcode()'返回200)。但数据是人类无法读取的文本 – 2015-02-09 03:59:38

+0

如果响应包含非本地化文本,则可以将字符集添加到请求标头。 – 2015-02-09 04:03:12

+0

这不是人类无法读取的文本,它是不可读的原因是字符集是特殊的 – 2015-02-09 04:09:53

0

使用蟒蛇美丽的汤

import request 
from bs4 import BeautifulSoup 
url = 'http://www.google.com' 
r=request.get(url) 
b=BeautifulSoup(r.text) 

B就包含所有的HTML标签,并为您提供iteractor遍历元/标签。要知道更多的链接是https://pypi.python.org/pypi/beautifulsoup4/4.3.2