笔记:udacity计算机导论 -5-29/30 查找、提取、并输出超链 if vs while

来源:互联网 发布:ecshop sql注入漏洞 编辑:程序博客网 时间:2024/05/21 11:32

本课里,要求用while语句查找并输出  href= 后超链。 刚开始用只用while语句,发现是死循环


def get_next_target(page):
    start_link = 0
    end_quote = 0
    
     while start_link != -1:
            start_link = page.find('<a href=',end_quote)
    #Insert your code below here
            start_quote = page.find('"', start_link)
            end_quote = page.find('"', start_quote + 1)
            url = page[start_quote + 1:end_quote]
            print url, end_quote

       print None, 0
               
get_next_target('<a href="www.co.com"> <a href="www.ah.com"> <a href="www.ut.com">.....<a href="">')    


    原因是,当循环到查找到最后一个a href= 后, 因为值为正,循环会再执行一次,但此时end_quote的值为-1, 于是相当于又重头开始查找、输出超链。 

    因此,必须在while下再加入if语句,控制跳出

def get_next_target(page):
    start_link = 0
    end_quote = 0
    if start_link == -1:
       print None, 0
    else:
        while start_link != -1:
            start_link = page.find('<a href=',end_quote)
    #Insert your code below here
            start_quote = page.find('"', start_link)
            end_quote = page.find('"', start_quote + 1)
            url = page[start_quote + 1:end_quote]
            if start_link == -1 or start_quote == -1 or end_quote == -1 or url == "":
                break
            else:
                print url, end_quote
            
    
get_next_target('<a href="www.co.com"> <a href="www.ah.com"> <a href="www.ut.com">.....<a href="     ">')    
                 

        上面if + or控制条件,确保程序在查找到到最后一个a href=语句后,不会再继续循环下去。

        但这样的代码还是有问题,如果传入的参数以<a href= 结尾,代码在查找到最后一个<a href= 时,其实是找不到超链了,但依旧会返回一个空值。


     在python里,上面代码的运行结果为:

www.co.com19

www.ah.com41

www.ut.com63

80


  注意上面的第2个if语句后,有一个url == "",愿意是希望当a href=后跟空字符串时,控制不输出。当传入的字符以a href=""结尾时,结果如预期。但是如果传入字符a href="",多个空格的字符串时,运行结果始终以一个空字符,再一个位置数值的输出结果结束。


如果代码改成这样:

def get_next_target(page):
    start_link = page.find('<a href=')
    #Insert your code below here
    start_quote = page.find('"', start_link)
    end_quote = page.find('"', start_quote + 1)
    url = page[start_quote + 1:end_quote]
    return url, end_quote
            
def printUrl(py):
    while True: #True必须首字母大写
        url,end_bd = get_next_target(py)
        py = py[end_bd:]
        if url:
            print url
        else:
            break
    
printUrl('<a href="www.co.com"> <a href="www.ah.com"> <a href="www.ut.com">.....<a ')    


输出结果是一样的。 不过后一种写法模块化更明显。维护起来可能更方便。


另外,这个题除了很好的提现了if, break 这个看似多余的语句的价值, 还清楚的区别了if 和 while 语句:


if是条件语句,无论真假,只执行一遍


while是循环语句,如果循环后的控制语句判断为真,则持续循环,若为假,则跳出循环。


所以while语句需要担心死循环,而if不需要。

阅读全文
0 0
原创粉丝点击