2017-09-24 234 views
-3

我需要将for循环转换为while循环的帮助,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)这样的检查。你可以考虑以下:

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) 

try-except块,以确保lastmod是否存在印刷的细节。否则,忽略并转到下一个URL。希望这可以帮助。干杯。

+0

谢谢。但我如何确保它保持运行并打印最新的变化,而不是整个XML? – D0USMOKEHAZE

+0

您必须在Linux中使用crontab在后台运行脚本,或者让该脚本在后台运行。 –

+0

是的,我使用byobu,但是,如果我想这个迭代继续运行找到所有新的更改到xml,我将不得不让它一个while循环正确?多数民众赞成即时尝试实现,不断监测网站地图的新变化,并打印这些变化。 – D0USMOKEHAZE