Как передать полученную информацию в таблицу в коде html? - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь сделать веб-парсер, который будет получать данные с веб-сайтов с коронавирусом. Я сделал скребок. Мне просто было любопытно, как передать полученные данные в свой код html. Я знаю, что этот тип веб-сайтов был создан, прежде чем я просто хочу сделать это для личного удовольствия. Вот мой код python.

from urllib.request import urlopen as uReq

from bs4 import BeautifulSoup as soup

import csv

from bs4 import NavigableString

from flask import Flask


page_url = 'https://www.cdc.gov/coronavirus/2019-ncov/cases-updates/cases-in-us.html

uClient = uReq(page_url)

page_soup = soup(uClient.read(), "html.parser")

uClient.close()

containers = page_soup.findAll("div",{"class":"callout"})

out_filename = "usacovid_deaths.csv"

headers = "Deaths \n"

Deaths = containers[0].span.text

print(Deaths +"\n")

with open(out_filename, 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile)
    spamwriter.writerow([Deaths])

html_file_smth = 'C:\\Users\\tshor\\OneDrive\\Desktop\\HTML\\Stats.html'

html_file_smth2 = 'C:\\Users\\tshor\\OneDrive\\Desktop\\HTML\\Stats2.html'

with open(html_file_smth, 'r', encoding = "utf-8") as htmll:

    reader = htmll.read()

html_content = soup(reader, 'html.parser')

tr_tag = html_content.find(attrs = {"id":"use-id"})

tr_tag.insert(0, NavigableString(str(Deaths)))

with open(html_file_smth2, 'w',encoding="utf-8") as html2:

    html2.write(reader)

Он говорит flask как импорт, но я не думаю, что это то, что мне нужно. Кроме того, я знаю, что это широкий вопрос, но я очень потерян, поэтому любая помощь будет отличной. Спасибо.

1 Ответ

0 голосов
/ 26 мая 2020

Я бы предложил создать отдельный модуль, который выполняет парсинг:

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 секунд. .

...