

* * *

**質問内容が分かりづらかったので、コードや欲しい結果を具体的に書きます**  
・再帰と勘違いしていたので、タイトルも変更しました

**最終的にやりたいこと**  
・[このリンク先にあるコード](https://github.com/REMitchell/python-
scraping/blob/master/chapter3/1-getWikiLinks.py)結果を、Bottleを使用してWeb画面上に表示したい

**試したこと**

[code]

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import datetime
    import random
    import re
    from bottle import route, view
    
    random.seed(datetime.datetime.now())
    
    def getLinks(articleUrl):
        html = urlopen("http://en.wikipedia.org"+articleUrl)
        bsObj = BeautifulSoup(html, "html.parser")
        return bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))
    
    @route('/')
    @view("test_template")
    def test():
        links = getLinks("/wiki/Kevin_Bacon")
        results = []
        while len(links) > 0:
            newArticle = links[random.randint(0, len(links)-1)].attrs["href"]
            results.append(newArticle)
            links = getLinks(newArticle)
            dict(results=results)
    
[/code]

・画面表示結果例

> ['/wiki/Randy_Quaid']

・上記はループ時にテンプレートへ渡しているので、ループ終了後に結果をまとめてテンプレートへ渡したいと思い、下記へ変更したら無限ループに陥ったのですがナゼでしょうか？

[code]

         while len(links) > 0:
             newArticle = links[random.randint(0, len(links)-1)].attrs["href"]
             results.append(newArticle)
             links = getLinks(newArticle)
         dict(results=results)
    
[/code]

・最終的に欲しい結果のイメージ(あくまでも想定の範囲です)

> ['/wiki/Richard_Chamberlain','/wiki/Richard_Chamberlain']

* * *

**以下当初質問した内容**

・下記コードで、ループ最中に随時出力するわけではなく、ループ終了後にまとめて取得したい場合はどうすれば良いでしょうか？

[code]

    def getHoge(p):
        return 処理
    
    res = getHoge("文字列")
    
    def hoge():
        while len(res) > 0:
            str = 処理
            print(str)
            links = getHoge(str)
    
    hoge()
    
[/code]

* * *

・文字列で構成されたオブジェクトで取得？  
※そもそも「どういう形式で取得できるか」自体、良く分かっていません

・試したけれどもうまく動作しない(無限ループ？)コード

[code]

    def getHoge(p):
        return 処理
    
    res = getHoge("文字列")
    
    result = ['1'] #変数定義。代入しないと定義できないと書いてあったので取り敢えず適当に'1'を代入しました
    def hoge():
        global result
        while len(res) > 0:
            str = 処理
            print(str)
            result.append(str)
            links = getHoge(str)
        retuen result #ここで取得したい
    hoge()
    
[/code]


CC BY-SA 3.0
2017-05-23T04:21:43.103
34951
2017-05-23T10:44:56.113
2017-05-23T10:44:56.113
7886
7886
question
python
ループ終了後に、結果を最後にまとめて取得したい


以下でどうでしょう

[code]

    def getHoge(p):
        return 処理
    
    def hoge():
        results = []
        res = getHoge("文字列")
        while len(res) > 0:
            str = 処理
            results.append(str)
            res = getHoge(str)
        return results
    
    results = hoge()
    
[/code]


CC BY-SA 3.0
2017-05-23T05:02:00.770
34953
2017-05-23T05:02:00.770
806
34951
answer


質問の内容が要領を得ないのですが，こういうことでしょうか．

[code]

    def getHoge(p):
        return 処理
    
    def hoge(res, results = []):
        if len(res) > 0:
            str = 処理
            results.append(str)
            hoge(getHoge(str), results)
        return results
    
    hoge(getHoge("文字列"))
    
[/code]

元のコードでは`res`が更新されないので，最初に`len(res) > 0`であれば無限ループになります．  
また，変数`links`が何を指すのかも不明だったので，とりあえず`links == res`として考えました．


CC BY-SA 3.0
2017-05-23T07:47:01.637
34959
2017-05-23T07:47:01.637
3091
34951
answer