如何使用BeautifulSoup和Flask从循环中打印所有词典值

时间:2019-12-22 20:13:59

标签: python flask beautifulsoup jinja2

def search():
    query = "xxx"
    r = requests.get('website?q=' + query)
    soup = BeautifulSoup(r.content, 'lxml')
    results=[]
    for row in soup.findAll('li', attrs = {'class':'res'}):
        result = {}
        result['urltext'] = row.a.text
        result['url'] = row.cite.text
        results.append(result)

        return render_template('site.html', urll = result['url'], urltext = result['urltext'])
    else:
        return render_template('start.html')

当这样使用时,我在site.html中得到单个结果,就好像循环正在停止并获得第一个结果并将其传递给site.html。我希望所有发现的结果都能通过。

def search():
    query = "xxx"
    r = requests.get('website?q=' + query)
    soup = BeautifulSoup(r.content, 'lxml')
    results=[]
    for row in soup.findAll('li', attrs = {'class':'res'}):
        result = {}
        result['urltext'] = row.a.text
        result['url'] = row.cite.text
        results.append(result)

        print (result['url'])

使用打印可以给我所有结果。 但这是没有意义的,除非我放弃 render_template 想法并使用 result ['url'] result ['urltext'] 打印整个HTML >以某种方式。

1 个答案:

答案 0 :(得分:0)

您的问题是return,它总是立即终止函数,因此将永远不会执行下一个循环。因此,请勿在{{1​​}}循环内使用return

forelse一起使用也是一个错误的想法,因为只有在for-loo中使用else时,break才会执行。 for的工作方式不像for/else

另一个问题是if/else中的result['url']result['urltext']-它只有最后一个值。您在render_template中拥有所有值,而在resultsresult['url']中则没有。也许您应该将其发送为

result['urltext']

和内部模板使用

return render_template('site.html', results=results)

{% for row in results %}
   <a href="{{ row.url }}">{{ row.ulrtext }}</a>
{% endfor %}