2017-09-24 2 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을 실행하고 새로 편집 한 마지막 mod 요소 인 xml을 어떻게 인쇄합니까? – 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