【问题标题】:Query to search API flask prints everything twice查询搜索 API 烧瓶将所有内容打印两次
【发布时间】:2021-10-01 06:13:19
【问题描述】:

首先让我说我没有参加考试,只是为将来的考试做准备。我正在尝试解决“从电影数据库中检索信息的 HTTP GET 方法”。问题

: 需要在哪里查询 https://jsonmock.hackerrank.com/api/movies/search/?Title=substr(replace substr)。 初始化titles数组以存储总字符串元素。将满足搜索条件的每部电影的标题存储在标题数组中。 按升序对标题进行排序并将其作为您的答案返回。 来自网站的查询响应是一个 JSON 响应,包含以下五个字段: page : 当前页面。

per_page :每页的最大结果数。 total :搜索结果中的电影总数。 total_pages :为获得所有结果而必须查询的总页数。 data :包含电影信息的 JSON 对象数组,其中 Title 字段表示电影的标题。 为了获得所有结果,您可能必须发出多个页面请求。要按编号请求页面,您的查询应为 https://jsonmock.hackerrank.com/api/movies/search/?Title=substr&page=pageNumber ,替换 substr 和 pageNumber。

我已经能够使用 python 解决它,但我的解决方案将所有内容打印两次。如果有人可以提出解决方法,我将不胜感激。谢谢 :)

import requests
import json

def getMovieTitles(substr):
    Movietitles = []  
    connection = requests.get("https://jsonmock.hackerrank.com/api/movies/search/?Title={}".format(substr))  
    response = json.loads(connection.content.decode('utf-8'))    
    for page in range(0, response["total_pages"]):       
        page_response = requests.get("https://jsonmock.hackerrank.com/api/movies/search/?Title={}&page={}".format(substr, page + 1))    
        page_content = json.loads(page_response.content.decode('utf-8'))
        for item in range(0, len(page_content["data"])):           
             Movietitles.append(str(page_content["data"][item]["Title"]))  
    Movietitles.sort()  
    return(Movietitles)

print(getMovieTitles("spiderman"))

【问题讨论】:

    标签: python html json python-3.x


    【解决方案1】:

    第 9 行 URL 的查询字符串参数不太正确。你有?Title={}&page={},你的意思可能是?Title={}&page={}

    API 会将最后一个参数读取为amp;page(或类似的)而不是page。在这种情况下,API 会简单地忽略未知参数,并在每次循环时返回第 1 页。由于标题“蜘蛛侠”总共有两页,所以您会看到第一页两次。

    请求可以为您构建查询字符串。像这样。

    url = "https://jsonmock.hackerrank.com/api/movies/search/"
    parameters = {"title": "spiderman", "page": 2}
    response = requests.get(url, params=parameters)
    

    【讨论】:

      【解决方案2】:

      重写和简化:-

      import requests
      import json
      
      
      def getMovieTitles(s):
          titles = []
          url = f'https://jsonmock.hackerrank.com/api/movies/search/?Title={s}'
          r = requests.get(url)
          r.raise_for_status()
          j = r.json()
          for p in range(j['total_pages']):
              r = requests.get(f'{url}&page={p+1}')
              r.raise_for_status()
              j = r.json()
              for d in j['data']:
                  titles.append(d['Title'])
          return sorted(titles)
      
      
      print(getMovieTitles("spiderman"))
      

      【讨论】:

        【解决方案3】:

        给你。如果您取消注释我指出的行,您会看到发生了什么 - 几部电影具有相同的标题,但制作时间不同。您可以通过调用 set 来删除这些重复项,就像我在下面的代码中所做的那样。

        import requests
        import json
        
        def getMovieTitles(substr):
            Movietitles = []
            connection = requests.get("https://jsonmock.hackerrank.com/api/movies/search/?Title={}".format(substr))
            response = json.loads(connection.content.decode('utf-8'))
            for page in range(0, response["total_pages"]):
                page_response = requests.get("https://jsonmock.hackerrank.com/api/movies/search/?Title={}&page={}".format(substr, page + 1))
                page_content = json.loads(page_response.content.decode('utf-8'))
                for item in range(0, len(page_content["data"])):
                     Movietitles.append(str(page_content["data"][item]["Title"]))
                     # print(str(page_content["data"][item])) uncomment this to see what's going on - same movies, diff years
                    
            Movietitles = list(set(Movietitles))
            Movietitles.sort()
            return Movietitles
        
        print(getMovieTitles("spiderman"))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多