|
|
|
|
 怎么取得HTTP连接时的状态码? - gcd0318 [ 2005-04-20 14:29 | 183 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - xyb [ 2005-04-20 16:41 | 228 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - gcd0318 [ 2005-04-21 16:40 | 448 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - passworld [ 2005-04-21 19:25 | 134 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - gcd0318 [ 2005-04-22 10:54 | 177 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - passworld [ 2005-04-22 17:07 | 901 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - passworld [ 2005-04-22 12:46 | 1,202 byte(s)]
 Re: 怎么取得HTTP连接时的状态码? - limodou [ 2005-04-20 16:00 | 50 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
|
如果是4xx和5xx的状态码,可以在异常里获得,但是其他的呢?尤其3xx的也是很有用的,表示重定向,这时候需要通过这个状态码来判断。但是PYTHON把连接的这些信息似乎都封装的很严密,怎么才能得到?
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
这个方法偶试过,但是这个方法需要事先知道相关的页面。可是如果是某个网站的首页就是被重定向到其他位置的呢?
比如连接http://www.nju.edu.cn,这时的重定向是直接进行的,也就是说我并不知道这个域名下默认连接的页是哪一页,而是直接就被带到了另外一个页面。而对于页内嵌套代码进行的重定向,又似乎完全没有效果,因为返回的是200 OK,这时的重定向是由页面里的代码完成的。
这些时候用例子里的方法就无效了,因为例子里的方法需要向某一个特定的页发送请求
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
但是那些3xx的属于服务器的重定向,和页面无关,而且即使用geturl()也只能得到所在的网络文件夹,还是无法得到确切路径。有的会在页内脚本里写出具体的路径,但是也有很多页面做的没这么规矩
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
教你一个窍门,python 的源码写的都很简单,基本上会写程序的大多数模块都能写出来。碰到怪问题可以直接看代码,然后Mixin或者直接复制过来改代码。
从代码看,urllib.URLOpener 本身是没有处理 3xx 的,这时你只能自己处理这个重定向,这对于大多数程序员来说是没有必要的麻烦,所以有urllib.FancyURLOpener,它帮你做了处理重定向的问题,如果它处理了重定向,给出的码自然是2xx了。urlopen() 只是帮你新建了一个FancyURLOpener 的对象罢了。
你可以有自己的 http_error_3xx() Mixin 加到 FancyURLopener 上或者干脆继承它。然后处理。
对于 urllib2 也一样,看看代码就知道怎么自己解决了。Python的优势在于语言简单,所以谁也不比谁高明多少,不像perl,“高手”写出来的码让别人看,不是神经有问题的,基本上一点都看不懂。
至于说内嵌的不规则重定向,那些东西本来就是给一个完整的浏览器处理的,容易的话IE,mozilla也不用写得这么大了。你要想不用浏览器自己处理,那就是在和网页作者做斗争,网页用了 javascript, flash 来做网页,如果python内建能够分清它们,岂不是python要内建javascript, flash解释器了?你需要利用所有可以利用的工具:re, htmlparse... 针对具体网页做处理,完全自动的只能覆盖80%的网页,不可强求啊。连mozilla有时候碰上ie专门的网页也会座在那儿,不懂了。
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我看到的url是目标url,不是开始的url:
Python 2.3.5 (#2, Mar 26 2005, 17:32:32)
[GCC 3.3.5 (Debian 1:3.3.5-12)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib
>>> u=urllib.urlopen('http://www.sf.net')
>>> u.url
'http://sourceforge.net/index.php'
>>> u.geturl()
'http://sourceforge.net/index.php'
>>>
如果你说的网络文件夹是 http://www.slashdot.org/ 这样的名称,那么这是没有办法的,因为服务器给的就是这个,在某些服务器上就是这个,没有具体文件名。这你又要花时间去研究http服务器了。
|
|
|
[Original]
[Print]
[Top]
|
|
|