2015-05-09 105 views
0

我有兩個變量,一個包含絕對URL,另一個包含到另一個節的相對路徑。首先,我嘗試了一個簡單的連接。加入URL拋出異常

absolute_url = www.example.com 
relative_url = /downloads/images 
url = absolute_url + relative_url 

當我打印url變量時,我有一個格式正確的URL。但是,當我嘗試使用請求或urllib2的檢索數據,大約有一半拋出異常的時候:「NoneType」對象有沒有屬性「的GetItem

於是我研究,認爲也許我應該使用的urllib .urlparse.urljoin()來做到這一點,但我仍然得到錯誤。

但有趣的是,有時它有效,有時不起作用。關於這裏發生了什麼的任何想法?

編輯

下面是實際的代碼:

url = "http://www.hdwallpapers.in" 
html = requests.get(url) 
soup = BeautifulSoup(html.text) 

categories = ("Nature", "Animals & Birds", "Beach", "Bikes", "Cars","Dreamy & Fantasy", "Others", "Travel & World") 
random_category = random.randint(0, len(categories)) - 1 
selected_category = categories[random_category] 
selected_category_url = soup.find('a', text=selected_category) 

category_page_url_join = urlparse.urljoin(url, selected_category_url['href']) 
category_page_html = requests.get(category_page_url_join) 
+1

顯示出現錯誤的實際示例,包括使用requests/urllib2。 –

回答

1

你的categories列表:

categories = ("Nature", "Animals & Birds", "Beach", "Bikes", "Cars","Dreamy & Fantasy", "Others", "Travel & World") 

然後你選擇一個隨機和尋找它:

random_category = random.randint(0, len(categories)) - 1 
selected_category = categories[random_category] 
selected_category_url = soup.find('a', text=selected_category) 

這將可以更容易地編寫和公正的可讀性:

category_page_url_join = urlparse.urljoin(url, selected_category_url['href']) 

這意味着你的selected_category_url結束了None因爲你soup.find沒:

現在
selected_category_url = soup.find('a', text=random.choice(categories)) 

您的問題無疑是從哪裏來實際上找不到任何東西。所以,實際上你想運行None['href'](當然這失敗...)

注意requests不會做任何HTML實體轉義,但BeautifulSoup將嘗試在那裏可以,所以,如:

from bs4 import BeautifulSoup 
soup1 = BeautifulSoup('smith & jones') 
soup2 = BeautifulSoup('smith & jones') 
soup1, soup2 
(<html><body><p>smith &amp; jones</p></body></html>, 
<html><body><p>smith &amp; jones</p></body></html>) 

所以,既然你說「大約有一半的時間」,那麼這是因爲你有3個選擇您要搜索的是不匹配....嘗試&amp;,而不是替換&categories

+0

感謝您對我的腳本提出的改進建議。但不幸的是,代碼仍然崩潰。我測試了打印urlparse.urljoin()的返回值,並且我總是有一個格式正確的url。我可以在網絡瀏覽器上正常打開它。但是,當我作爲參數發送給requests.get()時,它只是崩潰。任何更多的改進想法都會受到歡迎。 – XVirtusX

+0

@XVirtusX您嘗試過多少次打印它?這是唯一的例外可以來自...如果不是 - 你需要添加完整的回溯到你的問題...'requests.get'不會給你指定的異常 –

+0

那麼,調試後的一個雖然並閱讀更多的urlparse文檔,我嘗試使用urlparse.urlsplit()在urljoin的返回和之後使用geturl(),它終於工作。不知道它爲什麼起作用。我似乎在蟒蛇的晦澀內部碰撞。 – XVirtusX