【问题标题】:Turning a 'for'-loop into a 'while'-loop将“for”循环变成“while”循环
【发布时间】:2018-03-05 15:40:54
【问题描述】:

我需要帮助将 for 循环转换为 while 循环,该循环仅打印/记录差异/对 xml 的更改。

这是我目前的代码。

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

【问题讨论】:

  • 为什么要把它变成一个while循环?

标签: python python-2.7 web-scraping


【解决方案1】:

对于您当前的用例,for 循环效果最好。但是,如果你真的想进入一个while循环,你可以这样做:

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

【讨论】:

  • 现在我将如何完成 24/7 运行并打印新编辑的 xml 的最后一个 mod 元素?
【解决方案2】:

如果我正确理解了您的问题,您将尝试仅记录与 lastmod 相关联的 url。对于这种情况,for 循环比while 效果最好,因为它会在到达列表末尾时自动结束迭代。在while循环的情况下,您必须明确处理i &lt; 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。希望这可以帮助。干杯。

【讨论】:

  • 谢谢。但是我如何确保它继续运行并打印最新的更改而不是整个 xml?
  • 您可能必须在 Linux 中使用 crontab 在后台运行脚本,或者让该脚本在后台运行。
  • 是的,我使用 byobu ,但是,如果我希望此迭代继续运行以找到对 xml 的所有新更改,我必须使其成为一个 while 循环正确吗?这就是我想要实现的目标,不断监控站点地图的新变化并打印这些变化。
  • 像监视器一样编辑答案。就可以了。如果你想终止监控,你必须明确地终止 Python 进程
  • 我不断收到引用错误。 Traceback(最近一次调用最后一次):文件“attmpt.py”,第 12 行,在 r = requests.get(url) 文件“C:\Python27\lib\site-packages\requests\api.py”,第 70 行,在 get Traceback 中(最近一次调用最后一次):文件“attmpt.py”,第 12 行,在 r = requests.get(url) 文件“C:\Python27\lib\site-packages\requests\ api.py”,第 70 行,在获取返回请求('get',url,params=params,**kwargs)
猜你喜欢
  • 2022-06-14
  • 2022-11-19
  • 2011-12-08
  • 1970-01-01
  • 2014-03-15
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多