2012-12-06 65 views
0

我有一個關於指向另一個url的url的奇怪問題。因此,舉例來說,我有一個網址:解析url指向python中另一個url的鏈接

http://mywebpage/this/is/a/forward 

最終指向另一個網址:

http://mynewpage/this/is/new 

我的問題是,當我使用例如urllib2的python中獲取的第一頁,它最終獲取第二頁。我想知道它是否有可能知道原始鏈接指向什麼。有沒有像「標題」,告​​訴我第二個鏈接,當我要求第一個鏈接?

對不起,如果這是一個非常愚蠢的問題!

回答

3

當您發出第一個URL的GET請求時,Web服務器將返回一個300系列回覆代碼,其中Location標頭的值爲第二個URL。你可以通過geturl method of the object returned by urlopen找到第二個來自Python的URL。如果涉及多個重定向,看起來urllib會告訴你最後一跳,並且沒有辦法獲取其他人。

這不會處理通過JavaScript或meta http-equiv="refresh"重定向,但你可能不是在這種情況下,或者你不會問你這樣的問題。

+0

感謝。 geturl正是我所需要的! – AJW

+1

+1。另外,「geturl」並不能讓你獲得先前的重定向。如果你真的需要整個鏈,你幾乎總是想關閉自動跟蹤並手動處理重定向(這很容易),在這一點上你有所有的信息(完整的標題等),而不是隻是網址。 – abarnert

+0

@ Zack,@ abarnert:還有一個問題:當我使用geturl的時候,urllib2會獲取實際的頁面嗎?或者不是?對不起,我是這裏的新手。再次感謝 – AJW

0

它通常通過RFC2616中定義的重定向響應代碼(3xx)完成,儘管原始頁面中的某些javascript無法實現「僞重定向效果」。

SO question是關於如何防止urllib2跟隨重定向,它看起來像你可能會使用的東西。

0

可以使用要求做到這一點:

>>> url = 'http://ofa.bo/foagK7' 
>>> r = requests.head(url) 
>>> r.headers['location'] 
'https://my.barackobama.com/page/s/what-does-2000-mean-to-you' 
+0

請求是否讓你獲得整個重定向鏈?或者重定向的完整標題而不僅僅是重定向的網址?如果是這樣,你應該表明解釋爲什麼它比'urllib2'更好。如果不是,那麼爲什麼你建議OP改變庫的功能,使他現有的庫功能完好,或者更容易? – abarnert