我正在为我的抓取工具做一个网站。在该网站上,我有三个输入字段(第二个是可选的)。如果用户未在第一个或第三个字段中输入任何内容,则会显示如下消息:
输入城市名称但未输入最后一个字段后,相同的消息将出现在最后一个字段中。
我想进行处理,以便用户无法在最后一个字段中输入除“wohnung”或“haus”之外的任何内容。我已经为其编写了代码,但它不起作用。如果用户在字段中输入任何内容,则表明抓取已开始,如下图所示:
因此,如果用户输入除上述单词之外的任何内容,我希望它显示出来,就像他们什么也没写一样。
处理输入字段的函数如下:
def run_scraper(city, subregion, apart_or_house):
# Ask the user for input
base_url = ""
while True:
if city != "":
break
else:
flash("City name cannot be empty. Please enter a valid city name.", "error")
return
while True:
if apart_or_house == "wohnung" or apart_or_house == 'haus':
break
elif apart_or_house == "":
flash("This field cannot be empty. Please enter what are you buying.", "error")
else:
flash("Please enter either 'wohnung' or 'haus'.", "error")
return
if subregion:
base_url = f"https://www.immobilienscout24.de/Suche/de/{city}/{city}/{subregion}/{apart_or_house}-kaufen"
else:
base_url = f"https://www.immobilienscout24.de/Suche/de/{city}/{city}/{apart_or_house}-kaufen"
#Run the scraper script with the provided inputs and base_url
subprocess.run(['python', 'scraper.py', city, subregion, apart_or_house, base_url])
session['scraping_finished'] = True
flash('Scraper has finished!', 'info')
g.scraping_finished = True
调用的路由代码如下:
@app.route('/scrape', methods=['GET', 'POST'])
def scrape():
form = ScrapingForm()
if form.validate_on_submit():
city = request.form.get('city')
subregion = request.form.get('subregion')
apart_or_house = request.form.get('apart_or_house')
if city and apart_or_house:
g.scraping_finished = False
threading.Thread(target=run_scraper, args=(city, subregion, apart_or_house)).start()
flash('Scraping started!', 'success')
else:
flash('Please fill all required fields.', 'error')
if g.get('scraping_finished', False):
flash('Scraper has finished!', 'info')
return render_template('scrape.html', form=form)
如果您想限制在公寓或房屋之间的选择,您可以使用您的表格。这消除了后续验证的需要。
class ScrapingForm(FlaskForm):
city = StringField('City',
validators=[DataRequired()]
)
subregion = StringField('Subregion',
validators=[Optional()]
)
apart_or_house = SelectField('Buying',
choices=[('wohnung', 'Apartment'), ('haus', 'House')],
)
@app.route('/scrape', methods=['GET', 'POST'])
def scrape():
form = ScrapingForm(request.form)
if form.validate_on_submit():
city = form.city.data
subregion = form.subregion.data
apart_or_house = form.apart_or_house.data
threading.Thread(target=run_scraper, args=(city, subregion, apart_or_house)).start()
# ...
return render_template('scrape.html', **locals())
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title></title>
</head>
<body>
<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.city.label() }}
{{ form.city() }}
{% if form.city.errors -%}
<ul>
{% for error in form.city.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<div>
{{ form.subregion.label() }}
{{ form.subregion() }}
{% if form.subregion.errors -%}
<ul>
{% for error in form.subregion.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<div>
{{ form.apart_or_house.label() }}
{{ form.apart_or_house() }}
{% if form.apart_or_house.errors -%}
<ul>
{% for error in form.apart_or_house.errors -%}
<li>{{ error }}</li>
{% endfor -%}
</ul>
{% endif -%}
</div>
<button type="submit">Submit</button>
</form>
</body>
</html>