def get_next_target(page):
start_link = page.find('<a href="')
if start_link == -1:
return None, 0
end_link = page.find('">', start_link)
url = page[start_link + 9 : end_link]
return url, end_link
def print_all_links(page):
url = True
while url != None:
url, endpos = get_next_target(page)
if url:
print url #True
page = page[endpos : ]
else:
break
page = '<div id="top_bin"><div id="top_content" class="width960"><div class="udacity float-left"><a href="http://udacity.com"><a href="http://udacity.com"><a href="http://udacity.com"><a href="http://udacity.com">'
print print_all_links(page)
我的问题是,当我打印出结果时,它将打印出四个URL并且预期会发生什么,但是当我将while设置为while url == True:
时,它将仅打印出一个URL,那么原因是什么? Isn&#t; t!=无等于==真
答案 0 :(得分:1)
请注意,首先返回此类哨兵并不是一个非常好的设计。 get_next_target
应该返回一个目标,而不是其他任何东西(暂时忽略找到下一个目标所需的状态)。如果出现错误,请引发异常。在这种情况下,缺少另一个目标并不是一个真正的错误,但正如我们所看到的,它确实表示迭代的结束。已经有一个例外:StopIteration
。
def get_next_target(page):
start_link = page.find('<a href="')
if start_link == -1:
raise StopIteration
end_link = page.find('">', start_link)
url = page[start_link + 9 : end_link]
return url, end_link
def print_all_links(page):
while True:
try:
url, endpos = get_next_target(page)
print url
page = page[endpos:]
except StopIteration:
break
我们可以编写一个更好的迭代器来返回给定页面的链接,但是,它没有公开解析页面所需的状态。
def get_targets(page):
while True:
start_link = page.find('<a href="')
if start_link == -1:
break
end_link = page.find('">', start_link)
yield page[start_link + 9:end_link]
def print_all_links(page):
for url in get_targets(page):
print url
答案 1 :(得分:0)
如果url == "http://stackoverflow.com"
怎么办?然后它不等于True
,所以while停止了。但 不等于None
,所以如果你检查一下,那么循环就会继续。
答案 2 :(得分:0)
如果你反而说
if url:
或
if bool(url) == True:
然后它会按预期工作。 url
仅为True一次,在第一次迭代后它是一个字符串"anystring" != True
,但bool("anystring")
其中“anystring”不是空字符串,为True。