2016-06-29 4 views
-1

非常に基本的なクローラを作成して、リンクが死んでいるかどうか、またはbs4を使用していないかどうかを確認しました。 アンカータグがhrefを持っているかどうかをチェックしたいのですが(この方法で、リンクがアクティブかどうかを確認できます)。ページにはアンカー要素が1つしかありません。Beautifulsoup4 - whileループを使用してデータを取得しようとしています

これはコードです:

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ループを使って実装しようとしましたが、何の結果も得られませんでした。

私はこれがうまくいかなかった理由と可能な解決方法を知りたいと思います。
ありがとうございます。

+0

しばらく待つとエラーが出ますか? '要求がタイムアウトするのを待って、再試行制限を設定することができます。さらに、 'request.head'を実行して、生存しているか死んでいるかだけ関心がある場合には、ステータスコードをチェックするよう要求することができます。 – sytech

+0

@ GadaaDhaariGeekでは、上記と同じことが適用されます。アンカータグにはsrc属性ではないhref属性があります。 –

答えて

3

それはあなたが上のタグをチェックしようとしているもののウェブサイトを知らずに言うのは難しいのですが、コードの観点から、少なくとも、あなたはおそらくnot a.has_attr('href')ではなく、あなたの目的は、アンカーがどのhrefを持っているかどうかを確認する場合a.get('href') != ''をやるべき属性はまったくありません。

また、あなたのifステートメントがfor -loopの一部であることを意図したようです。

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() 

また、常時ではなく、数秒ごとに確認するために少しスリープ状態にしたいと思うかもしれません。アンカーは何のhrefを持っていない

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

'if'文は' for'ループの一部でなければなりません。それから彼は ' 'タグごとにチェックするだけです。 – GadaaDhaariGeek

+0

はいforループで(間違えて)間違えてしまったのは残念です。私は睡眠のことを試みたが、それはどちらもうまくいかなかった。 –

+0

私はこれをforループで実行しようとしましたが、これは50回繰り返しますが、whileループでは動作しませんでした –

0

a.get('href')空の文字列に等しくなることはありません、それはなりますなし場合はTrueに評価決してますので、もし。

ないあなたはどれを取得しません場合は、アンカーを取得するのhrefとアンカーがある場合、1つだけのアンカーだけreturn soup.find("a", href=True)がある場合は、

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) 
関連する問題