2013-12-01 4 views
6

После входа на сайт я хочу собрать его ссылки. Это я с помощью этой функции (с помощью механизировать и urlparse библиотеки):python, "urlparse.urlparse (url) .hostname" return None value

br = mechanize.Browser() 

. 
. #logging in on website 
. 

for link in br.links(): 
    url = urlparse.urljoin(link.base_url, link.url) 

    hostname = urlparse.urlparse(url).hostname 
    path = urlparse.urlparse(url).path 

    #print hostname #by printing this I found it to be the source of the None value 

    mylinks.append("http://" + hostname + path) 

и я получаю сообщение об ошибке:

mylinks.append("http://" + hostname + path) 
TypeError: cannot concatenate 'str' and 'NoneType' objects 

Я не уверен в том, как это исправить, или даже если он может фиксироваться вообще. Есть ли способ принудительно добавить функцию, даже если она создаст нерабочий и странный результат для значения None?

В качестве альтернативы, то, что я действительно нахожу в ссылке, заканчивается. например, HTML код для одной из ссылок выглядеть следующим образом (что я после это мир «Lexik»):

<td class="center"> 
    <a href="http://UnimportantPartOfLink/lexik>>lexik</a> 
</td> 

так альтернативный маршрут будет, если Mechanize может просто собрать это значение напрямую, минуя ссылки и проблемы с неизвестными значениями

+1

Не можете ли вы просто обернуть оператор append в try, кроме блока? – RobinL

ответ

5

Еще один хорошим способ без какой-либо попытки и кроме блока -

Заменить hostname = urlparse.urlparse(url).hostname с

hostname = urlparse.urlparse(url).hostname or '' 

и аналогично пути = urlparse.urlparse(url).path с

path = urlparse.urlparse(url).path or '' 

Надеется, что это помогает!

+0

спасибо за предложение, которое все еще дало «TypeError: не может конкатенировать объекты« str »и« NoneType »message you – user3053161

+0

Получил проблему, спасибо! Позвольте мне сразу изменить – Arovit

+0

, который работает, аккуратное решение. Как это работает, похоже ли первое значение None, оно дает пустую строку? – user3053161

4

Почему бы не использовать блок try/except?

try: 
    mylinks.append("http://" + hostname + path) 
except TypeError: 
    continue 

Если есть ошибка, он просто пропустит добавление и продолжит цикл.

Надеюсь, это поможет!