Python Flask webapp中数据库查询的输入值匹配列表

Python Flask webapp中数据库查询的输入值匹配列表,python,mysql,flask,sqlalchemy,Python,Mysql,Flask,Sqlalchemy,有人帮我编写了一个脚本,它将从一个csv文件中获取URL,将其与另一个csv文件进行比较,并根据匹配结果输出返回值 new.csv-->1列:URL scrapers.csv-->2列:scraper\u dom,scraper\u id 该脚本看起来像: import csv from urllib.parse import urlparse from typing import List def fnetloc(any) -> str: try: p = ur

有人帮我编写了一个脚本,它将从一个csv文件中获取URL,将其与另一个csv文件进行比较,并根据匹配结果输出返回值

new.csv-->1列:URL

scrapers.csv-->2列:scraper\u domscraper\u id

该脚本看起来像:

import csv
from urllib.parse import urlparse
from typing import List

def fnetloc(any) -> str:
    try:
        p = urlparse(any)
        return p.netloc
    except IndexError:
        return 'Error'

class Scraper:
    def __init__(self, scraper_dom: str, scraper_id: str):
        self.scraper_dom = scraper_dom
        self.scraper_id = scraper_id
    def matches(self, fnetloc: str) -> bool:
        return fnetloc.endswith(self.scraper_dom)


class Site:
    def __init__(self, url: str):
        self.url = url
        self.fnetloc = fnetloc(url)
    def get_scraperid(self, scrapers: List[Scraper]) -> str:
        try:
            return next(x.scraper_id for x in scrapers if x.matches(self.fnetloc))
        except:
            return "[no scraper id found]"

sites = [Site(row[0]) for row in csv.reader(open("new.csv"))]
scrapers = [Scraper(row[0], row[1]) for row in csv.reader(open("scrapers.csv"))]

for site in sites:
    print(site.get_scraperid(scrapers), site.url, sep="\t")
这很好用,但我正在努力将其应用到一个webapp中,并试图利用pythonywhere的MySql数据库和SQLAlchemy实现相同的逻辑。 以下是迄今为止我得到的(除了视图呈现的HTML模板):

我遇到的麻烦是:

@app.route("/submit", methods=["GET","POST"])
def submit():
    que = [urlparse(item).netloc for item in request.form["urls"].split('\n')]
    ids = scrapers.filter(Scrapers.scraper_dom.in_(que))
    results = (ids, '\t', request.form["urls"])
    return render_template("submit.html", results=results)
我需要
que
迭代我的多行输入(用户将从excel粘贴大量URL列表),这非常好。然后,我需要获取每个
.netloc
值,并将其与scraper\u dom进行比较,以返回相应的scraper\u id值。最后,在列中输出原始url和id值,与此类似(尽管输出中不需要列名):

问题是,正如所写的,它只是从以下行返回SQL:

ids=scrapers.filter(scrapers.scraper\u dom.in(que))

类似于(www.1688.com的输入):

我错过了什么?我尝试过用几种不同的方法编写
id
,但我发现了错误:

ids=scrapers.filter(scrapers.scraper\u dom.in(que))

错误:

AttributeError:“Query”对象没有属性“scraper\u dom”

ids=Scrapers.query.filter(Scrapers.scraper\u dom.in(que))

错误:

AttributeError:类型对象“Scrapers”没有属性“query”

我使用的匹配思想基于:
[x表示a中的x,如果x表示b中的x]

您看到的是
查询的
str()
表示。您必须迭代它(执行它),或者调用
Query.all()
执行它并将结果作为列表获取。“AttributeError:type object'Scrapers'没有属性'query'”提示您有另一个同名的非模型类。@Ilja Everila在我的第一个脚本中,我注意到您在
打印
行中提到的内容。类似于id:results=(i,'\t',request.form[“url”])
?@IljaEverilä,我现在得到了UnboundLocalError:在赋值之前引用了局部变量'results',查看该错误,这似乎是
结果的范围问题。我曾尝试将结果作为参数传递给
def submit()
,但遇到了位置参数的问题。。。如何将
ids
的迭代传递到
results
,而不遇到这些变量引用错误?不完全是这样,那只是将
results
一个接一个地重新分配给查询的每个结果,直到最后
results
保存最后一个且仅保存最后一个结果。。。除非没有结果,在这种情况下,
results
永远不会被赋值,因此
UnboundLocalError
。如果您只需要所有结果,请使用
scrapers.filter(…).all()
获取列表。明白了。我在文档中看到了
.all()
,但我把它放在查询字符串
scrapers
的末尾,并尝试在提交视图中进行迭代。谢谢你的帮助!
@app.route("/submit", methods=["GET","POST"])
def submit():
    que = [urlparse(item).netloc for item in request.form["urls"].split('\n')]
    ids = scrapers.filter(Scrapers.scraper_dom.in_(que))
    results = (ids, '\t', request.form["urls"])
    return render_template("submit.html", results=results)