【问题标题】:Print function won't print the complete list before moving on打印功能在继续之前不会打印完整列表
【发布时间】:2018-01-12 04:38:26
【问题描述】:

我正在尝试打印结果页面的链接列表,然后在其自身上调用scraper 函数,同时将变量pageNum 加1。出于某种原因,此代码仅打印出每页上的第一个结果,而不是打印所有结果然后转到下一页。如何在递归调用scraper 函数之前等待我的打印函数完全完成

from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re


def scraper(pageNum):
        req = Request("http://www.someurl.com/Search/page="+str(pageNum)+"&facet_Category=20", headers={"User-Agent": "Mozilla/5.0"})
        html = urlopen(req).read()
        bsObj = BeautifulSoup(html)
        for result in bsObj.select("h2 a"):
            print(result["href"])
            scraper(pageNum+1)


scraper(1)    

【问题讨论】:

    标签: python beautifulsoup screen-scraping


    【解决方案1】:

    这样做是因为您在循环中递归地调用scraper,所以只要您打印第一个链接,递归就会发生。

    您可以通过将递归回调移动一个缩进来解决此问题,但请注意,递归并不是解决此类问题的真正好方法 - 您实际上应该只使用嵌套循环。 (除此之外,您似乎没有基本情况,因此您的递归永远不会结束。)

    def scraper(pageNum):
        while pageNum < SOME_TARGET_VALUE:
            req = Request("http://www.someurl.com/Search/page="+str(pageNum)+"&facet_Category=20", headers={"User-Agent": "Mozilla/5.0"})
            html = urlopen(req).read()
            bsObj = BeautifulSoup(html)
            for result in bsObj.select("h2 a"):
                print(result["href"])
            pageNum += 1
    

    【讨论】:

    • 非常感谢,非常感谢,我会考虑使用嵌套循环。
    【解决方案2】:

    从您的代码看来,您正在 for 循环中调用刮板函数以打印链接。只需将其移出 for 循环即可。

    def scraper(pageNum):
        req = Request("http://www.someurl.com/Search/page="+str(pageNum)+"&facet_Category=20", headers={"User-Agent": "Mozilla/5.0"})
        html = urlopen(req).read()
        bsObj = BeautifulSoup(html)
        for result in bsObj.select("h2 a"):
            print(result["href"])
        scraper(pageNum+1)
    

    【讨论】:

      猜你喜欢
      • 2019-05-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2022-01-01
      • 2020-11-22
      • 2017-01-25
      • 2013-12-31
      • 1970-01-01
      相关资源
      最近更新 更多