Проблема с циклическим циклом в Python - PullRequest
0 голосов
/ 05 августа 2011

Я продолжаю писать свой сканер в Твиттере и сталкиваюсь с другими проблемами. Посмотрите на код ниже:

from BeautifulSoup import BeautifulSoup
import re
import urllib2

url = 'http://mobile.twitter.com/NYTimesKrugman'

def gettweets(soup):
    tags = soup.findAll('div', {'class' : "list-tweet"})#to obtain tweet of a follower
    for tag in tags: 
        print tag.renderContents()
        print ('\n\n')

def are_more_tweets(soup):#to check whether there is more than one page on mobile 
    links = soup.findAll('a', {'href': True}, {id: 'more_link'})
    for link in links:
        b = link.renderContents()
        test_b = str(b)
        if test_b.find('more'):
            return True
        else:
            return False

def getnewlink(soup): #to get the link to go to the next page of tweets on twitter 
    links = soup.findAll('a', {'href': True}, {id : 'more_link'})
    for link in links:
        b = link.renderContents()
        if str(b) == 'more':
            c = link['href']
            d = 'http://mobile.twitter.com' +c
            return d

def checkforstamp(soup): # the parser scans a webpage to check if any of the tweets are   
    times = soup.findAll('a', {'href': True}, {'class': 'status_link'})
    for time in times:
        stamp = time.renderContents()
        test_stamp = str(stamp)
        if test_stamp.find('month'): 
            return True
        else:
            return False


response = urllib2.urlopen(url)
html = response.read()
soup = BeautifulSoup(html)
gettweets(soup)
stamp = checkforstamp(soup)
tweets = are_more_tweets(soup)
print 'stamp' + str(stamp)
print 'tweets' +str (tweets)
while (not stamp) and tweets: 
    b = getnewlink(soup)
    print b
    red = urllib2.urlopen(b)
    html = red.read()
    soup = BeautifulSoup(html)
    gettweets(soup)
    stamp = checkforstamp(soup)
    tweets = are_more_tweets(soup)
print 'done' 

Код работает следующим образом: Для одного пользователя NYTimesKrugman -Я получаю все твиты на одной странице (gettweets) -предоставлено больше твитов (больше твитов) и что я еще не получил месяц твитов (checkforstamp), я получаю ссылку на следующую страницу твитов -Я иду на следующую страницу твитов (входя в цикл while) и продолжаю процесс, пока не будет нарушено одно из вышеуказанных условий

Однако я провел обширное тестирование и определил, что на самом деле не могу войти в цикл while. Скорее программа не делает этого. Это странно, потому что мой код написан так, что твиты верны, а штамп должен давать ложь. Тем не менее, я получаю следующие результаты: я действительно сбит с толку!

<div>
<span>
<strong><a href="http://mobile.twitter.com/nytimeskrugman">NYTimeskrugman</a></strong>
<span class="status">What Would I Have Done? <a rel="nofollow"   href="http://nyti.ms/nHxb8L" target="_blank" class="twitter_external_link">http://nyti.ms/nHxb8L</a></span>
</span>
<div class="list-tweet-status">
<a href="/nytimeskrugman/status/98046724089716739" class="status_link">3 days ago</a>
</div>
<div class="list-tweet-actions">
</div>
</div>




stampTrue
tweetsTrue
done
>>> 

Если бы кто-то мог помочь, это было бы здорово. Почему я не могу получить более 1 страницы твитов? Мой анализ в checkstamp выполняется неправильно? Thanx.

Ответы [ 2 ]

1 голос
/ 05 августа 2011
if test_stamp.find('month'): 

оценивается как True, если не находит month, потому что возвращает -1, когда не находит подстроку.Здесь значение будет False только в том случае, если month было в начале строки, поэтому его позиция была 0.

Вам нужно

if test_stamp.find('month') != -1: 

или просто

return test_stamp.find('month') != -1
1 голос
/ 05 августа 2011

Ваша функция checkforstamp возвращает непустые, определенные строки:

return 'True'

Так что (not stamp) всегда будет ложным.

Измените его, чтобы оно возвращало логические значения, как are_more_tweets:

return True

и все должно быть в порядке.

Для справки см. логические операции Документация:

В контекстеБулевы операции, а также когда выражения используются операторами потока управления, следующие значения интерпретируются как ложные: False, None, числовой ноль всех типов и пустые строки и контейнеры (включая строки, кортежи, списки, словари, наборы и frozensets).). Все остальные значения интерпретируются как true.

...

Оператор not возвращает True, если его аргумент равен false, False в противном случае.

Редактировать:

Та же проблема с тестом if в checkforstamp.Так как find('substr') возвращает -1, когда подстрока не найдена, str.find('substr') в логическом контексте будет True, если нет совпадения в соответствии с приведенными выше правилами.

Это не единственное место вВаш код, где эта проблема появляется.Пожалуйста, просмотрите все ваши тесты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...