Вопрос:

Колба: одна страница, 3 функции - можно получить только 1 функцию для печати на веб-странице

python flask

59 просмотра

1 ответ

23 Репутация автора

У меня есть программа с тремя функциями. Каждая функция извлекает данные с другой веб-страницы, сохраняет их в список и распечатывает список.

Я запустил это в Терминале, и это работает.

Я хочу напечатать эти списки на одной веб-странице.

Я могу получить одну функцию для печати, но я не знаю, как поместить несколько функций в колбу.

Вот что работает:

.py файл

from flask import Flask, render_template    
import bs4 as bs
import urllib.request

app = Flask(__name__)

@app.route('/')
def chinaAds():

    sauce = urllib.request.urlopen('http://www.eslcafe.com/jobs/china/').read()
    soup = bs.BeautifulSoup(sauce, 'html.parser')
    dl = soup.dl
    chinaAds = []
    china = []

    for words in dl.find_all('a'):
        links = words.get('href')
        link_text = words.text

        if ('university' in link_text.lower()) or ('universities' in link_text.lower()) or ('college' in link_text.lower()) or ('colleges' in link_text.lower()):
            chinaAds.append([links, link_text])

    for ad in chinaAds:
        china.append(tuple(ad))
    return render_template("eslJobs.html", china=china) 

Вот как я печатаю в моем .html файле

<ul class="list-group col-md-4" style="padding-left: 18px;">
{% for href, caption in china %}
  <li class="list-group-item"><a href="{{ href }}">{{ caption }}</a></li>
{% endfor %}
</ul>

Материал, который я хочу добавить в .py файл

Две функции, которые я хочу добавить, такие же, как и первая, только с разными переменными, и они соскребаются с разных веб-страниц.

def koreaJobs():
    sauce = urllib.request.urlopen('http://www.eslcafe.com/jobs/korea/').read()
    soup = bs.BeautifulSoup(sauce, 'html.parser')
    dl = soup.dl
    koreaAds = []
    korea []

    for words in dl.find_all('a'):
        links = words.get('href')
        link_text = words.text

        if ('university' in link_text.lower()) or ('universities' in link_text.lower()) or ('college' in link_text.lower()) or ('colleges' in link_text.lower()):
            koreaAds.append([links, link_text])

    for ad in koreaAds:
        korea.append(tuple(ad))
    return render_template("eslJobs.html", korea=korea)

def intlJobs():
    sauce = urllib.request.urlopen('http://www.eslcafe.com/joblist/').read()
    soup = bs.BeautifulSoup(sauce, 'html.parser')
    dl = soup.dl
    intlAds = []
    intl = []

    for words in dl.find_all('a'):
        links = words.get('href')
        link_text = words.text

        if ('university' in link_text.lower()) or ('universities' in link_text.lower()) or ('college' in link_text.lower()) or ('colleges' in link_text.lower()):
            intlAds.append([links, link_text])

    for ad in intlAds:
        intl.append(tuple(ad))
    return render_template("eslJobs.html", intl=intl)

Я буду печатать данные из этих функций в двух новых списках на моей странице .html

Автор: nasan Источник Размещён: 22.03.2017 09:30

Ответы (1)


1 плюс

2066 Репутация автора

Решение

Вот быстрый пример, одним из способов было бы упростить функцию (и) скребка, чтобы они просто возвращали списки, а затем добавляли аргументы в render_template():

from flask import Flask, render_template
import bs4 as bs
import urllib.request

app = Flask(__name__)

def get_ads(url):
    """ This function returns a list of tuples. """
    terms = ['universit', 'college']
    sauce = urllib.request.urlopen(url).read()  #
    soup = bs.BeautifulSoup(sauce, 'html.parser')
    ads = []
    for words in soup.dl.find_all('a'):
        links = words.get('href')
        link_text = words.text
        if any(x in link_text.lower() for x in terms):
            ads.append(tuple([links, link_text]))
    return ads

# call functions here when the app starts
china = get_ads('http://www.example.com/jobs/china/')
korea = get_ads('http://www.example.com/jobs/korea/')
jobs = get_ads('http://www.example.com/joblist/')

@app.route('/')
def index():
    # or call functions here each time a page is requested

    return render_template("index.html", china=china, korea=korea, jobs=jobs)

if __name__ == '__main__':
    app.run(debug=True)

index.html

<ul class="list-group col-md-4" style="padding-left: 18px;">
    {% for href, caption in china %}
      <li class="list-group-item"><a href="{{ href }}">{{ caption }}</a></li>
    {% endfor %}
</ul>
<ul class="list-group col-md-4" style="padding-left: 18px;">
    {% for href, caption in korea %}
      <li class="list-group-item"><a href="{{ href }}">{{ caption }}</a></li>
    {% endfor %}
</ul>
<ul class="list-group col-md-4" style="padding-left: 18px;">
    {% for href, caption in jobs %}
      <li class="list-group-item"><a href="{{ href }}">{{ caption }}</a></li>
    {% endfor %}
</ul>
Автор: brennan Размещён: 22.03.2017 10:29
Вопросы из категории :
32x32