Я бы предложил создать отдельный модуль, который выполняет парсинг:
scrape.py
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
from bs4 import NavigableString
def get_deaths():
page_url = 'https://www.cdc.gov/coronavirus/2019-ncov/cases-updates/cases-in-us.html'
print ('Hitting URL: ', page_url)
uClient = uReq(page_url)
page_soup = soup(uClient.read(), "html.parser")
uClient.close()
containers = page_soup.findAll("div",{"class":"callout"})
Deaths = containers[0].span.text
return Deaths
if __name__ == '__main__':
deaths = get_deaths()
print (deaths)
Теперь вы можете запустить это вручную с помощью python scrape.py
или импортируйте функцию в другой модуль, который является вашим приложением flask. Конечно, это только одна фигура. Но если вы действительно хотите отобразить это в таблице, вы можете сделать:
app.py
from flask import Flask, render_template
from scrape import get_deaths
app = Flask(__name__)
@app.route('/')
def index():
# Create a list of column headers
headers = ['Deaths']
# Now the data, a list where each item is a list containing the row values
objects = [[ get_deaths() ]]
return render_template('index.html', headers=headers, objects=objects)
Что затем можно отобразить с помощью следующего шаблона:
templates / index. html
{% if objects %}
<table id='result' class='display'>
<thead>
<tr>
{% for header in headers %}
<th>{{header}}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for object in objects %}
<tr>
{% for item in object %}
<td>{{item}}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
Обратите внимание, что это позволяет избежать жесткого кодирования имен столбцов в файле шаблона при условии, что вы передадите список headers
самостоятельно из Python.
Запустите это с помощью flask run
и подключитесь к http://localhost:5000
в своем браузере.
Вы также можете использовать sh, чтобы посмотреть на мое репо search -generi c -tables , который включает JS данные библиотеки * в шаблоне для добавления таких вещей, как поиск и разбивка на страницы на лету.
Имейте в виду, что приведенный выше код выполняет повторную очистку сайт каждый раз, когда кто-то попадает на страницу. Есть несколько способов обойти это. Один из вариантов - использовать flask_caching , поэтому запустите pip install flask_caching
и затем украсьте функцию просмотра index
, чтобы определить тайм-аут.
# ...
app = Flask(__name__)
from flask_caching import Cache
cache = Cache(config={'CACHE_TYPE': 'simple'})
cache.init_app(app)
@app.route('/')
@cache.cached(timeout=50)
def index():
# Rest of code.
Теперь результат API будет кэшироваться на 50 секунд. .