如何在用户输入有效URL时为PYTHON / Flask设置代码?

时间:2013-08-09 07:09:39

标签: python html flask

我想知道我需要采用哪种方法使用Python或Flask来执行以下任务:

  • 检查网址是否有效
  • 如果有效,则返回该页面及其子页面上所有链接的列表

我的编辑器是崇高的,我在Windows Powershell下运行它

现在我的代码显示了这个:

enter image description here

因此,当您输入搜索时,它会转到新页面并显示结果(例如:ddddd)

enter image description here

但我想检查网址是否有效,如果有效则返回该网页及其子网页上所有链接的列表,如下所示:

enter image description here

对于编程世界中的新手有什么想法吗?(现在不是很新,还有很多需要学习的东西......)

感谢您的帮助。

这里我的代码带来了这个结果(它的工作):

所以一个项目文件夹里面有我的.py设置Flask和一个带.html的模板文件夹。


Python文件

# -*- coding: utf-8 -*-
from flask import Flask, render_template, request
import re

app = Flask (__name__)

@app.route("/")
def index():
    return render_template('index.html')

@app.route('/search', methods=['POST', 'GET'])
def search():
    error = True
    if request.method == 'POST':
        return request.form['urlsearch']
    else:
        return request.args.get('urlsearch')

if __name__ == "__main__":
    app.run()

HTML文件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>URL TEST</title>
</head>
<body>
    <ul id="navigation">
    {% for item in navigation %}
        <li><a href="{{ item.href }}">{{ item.caption }}</a></li>
    {% endfor %}
</ul>

    <h1 style="color:orange;">You can put your URL here :</h1>
    {{ a_variable }}

<form method="get" action="/search">
    <p>Please Input an URL below : </p>
<input type="text" name="urlsearch" />
        <input type="submit" value="Search" />
    </form>
</body>
</html>

2 个答案:

答案 0 :(得分:5)

您可以使用mechanize

from mechanize import Browser

br = Browser()    
r = br.open("http://www.example.com/")

if r.code == 200:
    for link in br.links():
        print link
else:
    print "Error loading page"

urllib2BeautifulSoup

from BeautifulSoup import BeautifulSoup
import urllib2

html_page = urllib2.urlopen("http://www.example.com")
if html_page.getcode() == 200:
    soup = BeautifulSoup(html_page)
    for link in soup.findAll('a'):
        print link.get('href')
else:
    print "Error loading page"

之前我没有和Flask合作过多,但试试这个:

据我所知,urlsearch是您从表单中获取的网址,因此请添加对其的检查

@app.route('/search', methods=['POST', 'GET'])
def search():
    error = True
    if request.method == 'POST':
        return request.form['urlsearch']
    else:    
        br = Browser()    
        r = br.open(request.args.get('urlsearch'))

        if r.code == 200:
            return br.links()
        else:
            return "Error loading page"

答案 1 :(得分:1)

在Flask中,您有app对象上所有网址的地图,您可以像这样访问它:

urlmap = app.url_map.__dict__['_rules_by_endpoint']

因此,如果您想在网页上获取所有网址规则,可以使用app.routes在文件底部添加以下内容:

def getUrls():
    urlmap = app.url_map.__dict__['_rules_by_endpoint']
    rules = []
    for rule in urlmap:
        rules.append(str(urlmap[rule]))
    result = []
    for rule in rules:
        result.append(rule.split()[1].replace('\'',''))
    return result

现在您只能编辑您的视图文件,即处理'/ search'路径的文件:

    if request.method == 'POST':
        urls = getUrls()
        query = str(request.form['urlsearch'])
        if query in urls:
            return str(urls)
        else:
            return "url not in urls"

您还需要编辑当前有错误的html表单,将表单方法指定为get,这需要发布,否则您将永远无法访问处理发布请求的块:

<form method="post" action="/search">

并且你会在页面上找到一个溃疡列表:

['/', '/search', '/static/']