Python Flask webapp中数据库查询的输入值匹配列表
有人帮我编写了一个脚本,它将从一个csv文件中获取URL,将其与另一个csv文件进行比较,并根据匹配结果输出返回值 new.csv-->1列:URL scrapers.csv-->2列:scraper\u dom,scraper\u id 该脚本看起来像: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
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)