2017-07-26 53 views
0

我目前运行一个进度条作为web刮刀的一部分,但它显得既计数URL的控制台,而不是进度条

(A)不准确 (B)缓慢的过程是什么。

with click.progressbar(range(1000000)) as bar: 
    for i in bar: 
     pass 

是否有文章/培训,我将能够阅读以更好地了解打印进度到控制台?

我有效地希望程序扫描列表中的网址,然后打印的进展,因为它遍历列表,沿着

扫描URL 1的30

    • 扫描线的东西的30扫描URL 3 30的

    URL

    如果可能的话,保持对同一行,但不是必需的。

    代码如下 - 如果有人能与任何培训或阅读帮助,我们将不胜感激。

    import requests 
    import csv 
    from lxml import html 
    URL_LIST = [ 
    "https://www.realestate.com.au/property/1-1-goldsmith-st-elwood-vic-3184", 
    "https://www.realestate.com.au/property/1-10-albion-rd-glen-iris-vic-3146", 
    "https://www.realestate.com.au/property/1-109-sydney-rd-manly-nsw-2095", 
    "https://www.realestate.com.au/property/1-1110-glen-huntly-rd-glen-huntly-vic-3163",] 
    
    with open('test.csv', 'wb') as csv_file: 
        writer = csv.writer(csv_file) 
    
        for index, url in enumerate(URL_LIST): 
         page = requests.get(url) 
         print 'scanning url....' 
    
         if text2search in page.text: 
          tree = html.fromstring(page.content) 
    
          (title,) = (x.text_content() for x in tree.xpath('//title')) 
          (price,) = (x.text_content() for x in tree.xpath('//div[@class="property-value__price"]')) 
          (sold,) = (x.text_content().strip() for x in tree.xpath('//p[@class="property-value__agent"]')) 
          writer.writerow([title, price, sold]) 
    
  • 回答

    1

    如果你要打印比进度条的指标其他多远沿着你展示,最简单的很可能是做定期打印。

    由于该问题的代码是为Python 2,我本来与Python代码2回答,但是这个问题可以很容易拿出来的Python 3级的用户,所以我增加了一节对他们来说太。

    一种Python的2

    版本以下基于并应补充的问题的代码:

    for index, url in enumerate(URL_LIST): 
        print 'Scanning url #' + str(index+1) + ' of ' + str(len(URL_LIST)) 
    

    您还可以选择添加你使用url可变扫描的网址您for循环产生。

    另外,如果你想有每个打印替换最后一个,你可以添加一个逗号,到打印语句的结束,以及\r字符添加到开头:

    for index, url in enumerate(URL_LIST): 
        print '\rScanning url #' + str(index+1) + ' of ' + str(len(URL_LIST)), 
    

    逗号防止print从一开始加入新行字符(\n)到最后,和\r(“回车”)删除已经打印行的其余部分之前是什么就行了。

    的差异print之间的Python 2 &的Python 3

    需要注意的是print功能在Python 2和Python 3完全不同的上述 'Python的2' 解决方案将不会出现在Python 3

    工作是很重要的

    首先,Python 3中的print是一个函数,而不是关键字,所以它必须被称为函数(即print('Print me!')),其次,将逗号添加到最后不会阻止新行字符的输出。 通常包括在端部具有逗号将没有可见效果然而解释评估它(如包含单个None的元组)使用Python REPL时可以看出。相反,必须向print函数提供一个命名参数(名为end)以覆盖它的默认值。

    一个为Python 3

    版本下面是一个Python 3相当于我在这个答案的上方提供的代码:

    for index, url in enumerate(URL_LIST): 
        print('Scanning url #' + str(index+1) + ' of ' + str(len(URL_LIST))) 
    

    如果你想有每个打印重复使用相同的路线,如上面的第二个例子:

    for index, url in enumerate(URL_LIST): 
        print('\rScanning url #' + str(index+1) + ' of ' + str(len(URL_LIST)), end='') 
    

    如果你没看过上面的一切,请注意end=''被重写print functi on的默认操作是在每行的末尾添加一个\n(换行符)字符,以便它添加一个空字符串,并且字符串开头的\r(回车)字符会导致Python返回到行来打印字符串的其余部分。

    +0

    这正是我正在寻找的,只需要缩短一点,并删除URL的打印,但这足以让我自己成长。 – James2086

    +0

    刚刚删除最后一节 - 所以现在读取 '扫描URL#'+ str(索引+ 1)+'的'+ str(len(URL_LIST)) 输出为 正在扫描URL#1 of 7 – James2086

    +0

    没有找一个简单的答案,因为我喜欢尝试为自己工作 - 但是有没有一种方法,以便在同一行上打印而不是回车? – James2086

    0

    tqdm是一个功能强大的进度条库。它让你做这样的事情。

    import tqdm 
    t = tqdm.tqdm(list('abcdefg')) 
    for i in t: 
        import time 
        time.sleep(1) 
        t.set_postfix(url=i) 
    

    进度条输出为:

    86%|██████████████████████████▏ | 6/7 [00:06<00:01, 1.00s/it, url=f] 
    
    +0

    感谢您的输入,我真的想要避免一个进度条 - 我已经有了这些,希望能够更快地计算和打印每个迭代,以便快速查看进度。感谢您提供协助 – James2086