本课里,要求用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不需要。