虽然Loop在Python中无法正常工作

时间:2018-04-17 10:43:52

标签: python while-loop beautifulsoup

    r = self.session.get(url, headers=headers)
    soup = BeautifulSoup(r.content, "html.parser")
    while True:
        if soup.find_all('div', {'class': 'function'}):
            break
        time.sleep(3)
        print ('Not Found... Trying again.')

    print ('Found soup...')

找不到while时的soup.find_all循环应该重试,直到找到soup.find_all。如果soup.find_all中存在r.content,它通常应该打印'找到汤......'但是它没有这样做,我做错了什么?

2 个答案:

答案 0 :(得分:4)

那个循环没有意义。 find_all可以在一次调用中找到所有内容,或者找不到任何内容,并且您将拥有无限循环(因为循环中任何内容都不会发生变化)。

所以解决方案只是有一个循环,只使用普通的if-else

r = self.session.get(url, headers=headers)
soup = BeautifulSoup(r.content, "html.parser")
if soup.find_all('div', {'class': 'function'}):
    print ('Found soup...')
else:
    print ('Not Found... Trying again.')

如果您打算从源代码重新获取HTML,那么您需要将所有代码放在循环中:

while True:
    r = self.session.get(url, headers=headers)
    soup = BeautifulSoup(r.content, "html.parser")
    if soup.find_all('div', {'class': 'function'}):
        print ('Found soup...')
        break
    else:
        print ('Not Found... Trying again.')
        time.sleep(3);

答案 1 :(得分:0)

soup.find_all(<HTML attribute>)返回查询属性的实例列表,如果没有找到则返回空列表。你不需要把它放在一个循环中。所以你可以这样做:

r = self.session.get(url, headers=headers)
soup = BeautifulSoup(r.content, "html.parser")
instances = soup.find_all('div', {'class': 'function'}):

if len(instances) == 0:
    print("No divs with class 'function'")
else:
    print("Yay, it was a success!")