Beautifulsoup4 - 尝试使用while循环获取数据

时间:2016-06-29 18:51:25

标签: python beautifulsoup bs4

我已经编写了一个非常基本的抓取工具来检查链接是否已经死亡或使用bs4。 我想检查锚标签是否有href(这样我可以检查链接是否有效)。页面中只有一个锚元素。

这是代码:

import requests
from bs4 import BeautifulSoup

def check():
    url = 'https://somewebsite.net/'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text,'html.parser')
    for a in soup.findAll('a'):
        href = a.get('href')
        if href != '':
            print('a')
        else:
            print('b')
check()

这很好但我希望抓取工具每隔几秒钟继续检查一次网站。我尝试使用无限循环来实现它,但我没有得到任何结果。

while True:
    check()

我想知道为什么这不起作用以及任何可能的解决方案 谢谢。

2 个答案:

答案 0 :(得分:3)

如果不知道您要检查哪些网站标签,很难说,但至少从代码的角度来看,如果您的目标是:not a.has_attr('href')而不是a.get('href') != '',那么您可能应该这样做看看锚是否有任何href属性。

此外,您可能希望if语句成为for循环的一部分。

import requests
from bs4 import BeautifulSoup

def check():
    url = 'https://somewebsite.net/'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text,'html.parser')
    for a in soup.findAll('a'):
        if a.has_attr('href'):
            print('b')
        else:
            print('a')
check()

你可能还想每隔几秒睡一会儿,而不是经常睡觉。

import time
...
while True:
    time.sleep(5) # sleep for 5 seconds
    check()

答案 1 :(得分:0)

a.get('href')永远不会等于空字符串,如果锚没有href,它将是 None ,因此你永远不会评估为True。

如果只有一个锚,那么只有return soup.find("a", href=True),如果有一个带有href的锚,你将得到锚,如果不是,你将得到无,

import requests
from bs4 import BeautifulSoup
from time import sleep

def check():
    url = 'https://somewebsite.net/'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text,'html.parser')
    return soup.find("a", href=True)


while True:
   a = check()
   if a:
       # do whatever
    sleep(10)