RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1600735
Accepted
Vyacheslav
Vyacheslav
Asked:2024-11-24 22:57:50 +0000 UTC2024-11-24 22:57:50 +0000 UTC 2024-11-24 22:57:50 +0000 UTC

屏幕显示的数据与导出到excel文件的数据不一致

  • 772

有一个 Flask 项目:

from flask import Flask, request, render_template, send_file
import requests
# import csv
import pandas as pd
from io import BytesIO
import logging
import json
# import pandas as pd
# from io import BytesIO
# -*- coding: utf-8 -*-
import sys

sys.stdout.reconfigure(encoding='utf-8')

logging.basicConfig(level=logging.DEBUG)
app = Flask(__name__)


# Функция для поиска вакансий
def search_vacancies(keyword):
    BASE_URL = "https://api.hh.ru/vacancies"
    vacancies_found = []  # Список для хранения найденных вакансий
    per_page = 100
    page = 0

    while True:
        params = {
            'text': keyword,
            'page': page,
            'per_page': per_page,
            'only_with_salary': True  # Только вакансии с зарплатой
        }

        response = requests.get(BASE_URL, params=params)
        if response.status_code != 200:
            print("Ошибка при обращении к API")
            break

        lan = response.json()

        if not lan['items']:
            break

        for item in lan['items']:
            # vacancy_name = item['name']
            vacancy_name = item['name'].lower()  # Приводим название вакансии к нижнему регистру для сравнения
            # Проверяем, содержит ли название вакансии ключевое слово
            if keyword in vacancy_name:
                salary_from = item['salary']['from'] if item['salary'] else None
                salary_to = item['salary']['to'] if item['salary'] else None
                currency = item['salary']['currency'] if item['salary'] else None
                city = item['area']['name'] if 'area' in item else None
                link = item['alternate_url'] if 'alternate_url' in item else None
                discription = item['snippet']['responsibility'] if 'snippet' in item else None

                vacancies_found.append({
                    'name': vacancy_name,
                    'salary_from': salary_from,
                    'salary_to': salary_to,
                    'currency': currency,
                    'city': city,
                    'link': link,
                    'discription': discription
                })

        page += 1

    return vacancies_found


@app.route('/download', methods=['POST'])
def download():
    keyword = request.form['work_name']
    vacancies = search_vacancies(keyword)

    df = pd.DataFrame(vacancies)
    output = BytesIO()
    df.to_excel(output, index=False)
    output.seek(0)
    return send_file(output, as_attachment=True, download_name='vacancies.xlsx')


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        keyword = request.form['keyword']
        vacancies = search_vacancies(keyword)
        print(len(vacancies))
        all_vacancies = (len(vacancies))
        if vacancies:
            # filename = save_to_json(vacancies)
            return render_template('index.html', vacancies=vacancies, download=True, all_vacancies=all_vacancies)
        else:
            return render_template('index.html', all_vacancies=0)
    return render_template('index.html')


if __name__ == '__main__':
    app.run(debug=True)
<h1>Парсер вакансий</h1>
<form method="POST">
    <label for="keyword">Введите вакансию для поиска:</label>
    <input type="text" id="keyword" style="margin-left: -2%;" name="keyword" required>
    <button type="submit">Искать</button>
</form>
{% if vacancies %}
<h2>Найденные вакансии: {{ all_vacancies }}</h2>
<form method="post" action="/download">
    <input type="hidden" name="work_name" value="{{ keyword }}">
    <input type="submit" value="Скачать в Excel">
</form>
<table>
    <tr>
        <th>Название</th>
        <th>Зарплата от</th>
        <th>Зарплата до</th>
        <th>Валюта</th>
        <th>Город</th>
        <th>Описание</th>
        <th>Ссылка</th>
    </tr>
    {% for vacancy in vacancies %}
    <tr>
        <td>{{ vacancy.name }}</td>
        <td>{{ vacancy.salary_from }}</td>
        <td>{{ vacancy.salary_to }}</td>
        <td>{{ vacancy.currency }}</td>
        <td>{{ vacancy.city }}</td>
        <td>{{ vacancy.discription }}</td>
        <td><a href="{{ vacancy.link }}" class="vacancy-link">{{ vacancy.link }}</a></td>
    </tr>
    {% endfor %}
</table>
{% elif message %}
<p>{{ message }}</p>
{% endif %}
<form method="post" action="/download">
    <input type="hidden" name="work_name" value="{{ keyword }}">
    <input type="submit" value="Скачать в Excel">
</form>
<!--{#</table>#}-->
</body>
</html>

问题是屏幕上显示的解析结果与导出到excel文件的数据不匹配。而且,我对某个关键字请求不同的数据,并且该关键字对应的数据显示在屏幕上,导出到excel文件的数据总是相同的,尽管它必须与屏幕上显示的数据相对应。我不明白为什么会发生这种情况,如果有人知道,请告诉我问题是什么。

项目链接:https://abram742.pythonanywhere.com/

python
  • 1 1 个回答
  • 39 Views

1 个回答

  • Voted
  1. Best Answer
    Vitalizzare
    2024-11-28T00:47:34Z2024-11-28T00:47:34Z

    关于浏览器中的数据和Excel中的数据的区别,有两点需要注意。

    首先,您没有传入表单中存储的render_template值。保存到 Excel 文件时,您使用As中的值重新查询数据,但其中没有任何内容。即每次对空行的查询结果都存储在表中。keyword"work_name""work_name"keyword

    其次,第一次请求后,数据可能会发生变化(空缺被删除或添加),结果可能与屏幕不符。最好将数据保存到客户端的表中,或者至少将其缓存在服务器上,以避免重复请求数据源。

    使应用程序正常运行的最小更改:

    from flask import redirect
    
    def download():
        keyword = request.form.get('work_name', '').strip()
        if keyword == '':    # ничего не делать если keyword не задан
            return redirect('/')   
        ...
    
    def index():
        keyword = request.form.get('keyword', '').strip()
        if request.method == 'POST' and keyword:   # обновлять страницу только если задано ключевое слово
            vacancies = search_vacancies(keyword)
            ...
            if vacancies:
                return render_template('index.html', 
                                       vacancies=vacancies, 
                                       download=True, 
                                       all_vacancies=all_vacancies, 
                                       keyword=keyword)     # сохранить keyword на html-странице
            else:
                return render_template('index.html', 
                                       all_vacancies=0,     # даже если по запросу ничего нет
                                       keyword=keyword)     # сохранить keyword на html-странице
        return render_template('index.html')   # пустой keyword приемлем для стартовой страницы без каких-либо данных
    

    为了避免保存时重复请求而进行的最小更改:

    from functools import lru_cache
    
    @lru_cache(maxsize=1)     # хранить в кеше только результат крайнего запроса
    def search_vacancies(keyword):
        ...
    

    这种缓存的缺点是,对同一单词的重复请求会返回过时的结果。例如,如果客户端发出请求,最小化浏览器,一天后返回并重复相同的搜索,那么他将收到相同的答案。经过一段时间后清除缓存是值得的。

    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5