2017-09-24 22 views
-3

forループをwhileループに変換すると助けが必要です。これはxmlの相違点や変更点のみを出力/記録します。'for'ループを 'while'ループに変える

これはこれまでのコードです。

import requests 
from bs4 import BeautifulSoup 

url = "https://www.ruvilla.com/media/sitemaps/sitemap.xml" 
r = requests.get(url) 
soup = BeautifulSoup(r.content) 

for url in soup.find_all("url"): 
    titlenode = url.find("loc") 
    if titlenode: 
    title = titlenode.text 
    loc = url.find("loc").text 
    lastmod = url.find("lastmod").text 
    print title + "\n" + lastmod 
+0

なぜあなたはwhileループにしたいのですか? – theonlygusti

答えて

1

現在の使用例では、forループが最適です。あなたが本当にwhileループにしたい場合は、あなたはそうのようなことを行うことができます。

urls = soup.find_all("url") 
counter = 0 
while counter < len(urls)-1: 
    counter += 1 
    url = urls[counter] 
    #Your code here 
+0

どうすれば24時間7日稼働させ、最後に編集したxmlの最後のmod要素を印刷するのですか? – D0USMOKEHAZE

0

を私が正しくあなたの質問を理解している場合は、関連するlastmod属性を持つURLのみをログに記録しようとしています。この場合、forループはwhileの代わりに最適に機能します。これは、リストの末尾に達すると自動的に繰り返しを終了するためです。 whileループの場合と同様に、i < len(size)のようなチェックで明示的に処理する必要があります。 try-exceptブロックがlastmod場合は、詳細を印刷存在することを確認することです

while True:. # Loop infinitely 
    r = requests.get(url) 
    soup = BeautifulSoup(r.content) 

    for url in soup.find_all('url'): 
     lastmod = url.find("lastmod").text 
     if not lastmod: 
      continue 

     loc = url.find("loc").text 
     titlenode = url.find("loc") 

     if titlenode: 
      title = titlenode.text 

    time.sleep(1) 

:あなたは以下を検討することができます。それ以外の場合は無視して次のURLに進みます。お役に立てれば。乾杯。

+0

ありがとうございます。しかし、どのように私はそれが実行し続け、XML全体ではなく最新の変更を印刷することを確認するのですか? – D0USMOKEHAZE

+0

Linuxではcrontabを使用してバックグラウンドでスクリプトを実行するか、このスクリプトをバックグラウンドで実行しておく必要があります。 –

+0

はい私はbyobuを使用していますが、この繰り返しがxmlのすべての新しい変更を見つけるために実行し続けるようにするには、whileループを正しく作成する必要がありますか?何を達成しようとしているのか、常に新しい変更のためのサイトマップを監視し、それらの変更を印刷します。 – D0USMOKEHAZE

関連する問題