【问题标题】:lengths of lists are not same when appending items追加项目时列表的长度不同
【发布时间】:2019-08-21 10:01:55
【问题描述】:

我正在从事一个网络抓取项目,在该项目中,我必须在网站中搜索产品并将产品的所有详细信息附加到相应的列表中。

例如,URL 的第一页列出了 10 个名称为“CLOSE UP”的产品。我必须将产品的标题附加到列表中,将产品的条形码附加到另一个列表等等..

我也必须为多个页面执行此操作。

这是我目前的代码

def find_items(base_url, item_to_find, num_of_pages):
    
    title_list = []
    barcode_list = []
    category_list = []
    manufacturer_list = []
    
    url = base_url + item_to_find + '/'
    
    for num in range(1, num_of_pages+1):
        url = url + str(num)
        print(url)
        page = requests.get(url)
        soup = BeautifulSoup(page.content, 'html.parser')
        a_tags = soup.find_all('a', {"class": 'product-search-item'})
        
        for tag in a_tags:
            p_tags = tag.find_all('p')
            try:
                title_list.append(p_tags[0].contents[0])
                barcode_list.append(p_tags[1].contents[0])
                category_list.append(p_tags[2].contents[0])
                manufacturer_list.append(p_tags[3].contents[0])
            except Exception as e:
                title_list.append('NaN')
                barcode_list.append('NaN')
                category_list.append('NaN')
                manufacturer_list.append('NaN')
                    
        
        
        url = base_url + item_to_find + '/'
        
    return (title_list, barcode_list, category_list, manufacturer_list)

在上面的代码中,我使用 try except 条件将信息附加到列表中,因为并非所有产品都具有所有信息。如果信息可用,则追加到列表中,否则追加“NaN”。这就是代码应该做的。这可确保列表的长度始终保持不变。

但是当我运行下面的代码时,列表的长度是不一样的。

title_list, barcode_list, category_list, manufacturer_list = find_items("https://www.barcodelookup.com/", 'close-up', 20)

我不知道我做错了什么。

【问题讨论】:

    标签: python web-scraping beautifulsoup python-requests


    【解决方案1】:

    在您的尝试中,除非其中一个附加失败,您将 NaN 附加到每个附加。用这个改变你的代码。

    for tag in a_tags:
        p_tags = tag.find_all('p')
        try:
            title_list.append(p_tags[0].contents[0])
        except Exception as e:
            title_list.append('NaN')
        try:
            barcode_list.append(p_tags[1].contents[0])
        except Exception as e:
            barcode_list.append('NaN')
        try:
            category_list.append(p_tags[2].contents[0])
        eexcept Exception as e:
            category_list.append('NaN')
        try:
            manufacturer_list.append(p_tags[3].contents[0])
        except Exception as e:
            manufacturer_list.append('NaN')
    

    【讨论】:

    • 感谢您的回答。我现在明白了,我做错了什么。
    【解决方案2】:

    也许发生的事情是你的尝试:在某个时候失败了,你在 except: 中添加了更多的项目:

    try:
        title_list.append(p_tags[0].contents[0])
    except Exception as e:
        title_list.append('NaN')
    try:
        barcode_list.append(p_tags[1].contents[0])
    except:
        barcode_list.append('NaN')
    try:
        category_list.append(p_tags[2].contents[0])
    except:
        category_list.append('NaN')
    try:
        manufacturer_list.append(p_tags[3].contents[0])  
    except:
        manufacturer_list.append('NaN')
    

    【讨论】:

      【解决方案3】:

      问题出在你try-except 逻辑上。让我们假设p_tags[3] 不存在。您已经附加了p_tags[0].contents[0]p_tags[1].contents[0]p_tags[2].contents[0],然后您会收到列表索引超出范围的异常。在except 子句中,您将再次将NaN 附加到所有四个列表中。请注意,您已为 title_listbarcode_listcategory_list 添加了实际值和 NaN

      修复取决于您想要什么。一个合理的选择是仅在您无法访问该特定值时附加 NaN

      def find_items(base_url, item_to_find, num_of_pages):
      
          title_list = []
          barcode_list = []
          category_list = []
          manufacturer_list = []
      
          a_tag_count = 0
      
          url = base_url + item_to_find + '/'
      
          for num in range(1, num_of_pages+1):
              url = url + str(num)
              print(url)
              page = requests.get(url)
              soup = BeautifulSoup(page.content, 'html.parser')
              a_tags = soup.find_all('a', {"class": 'product-search-item'})
              a_tag_count += len(a_tags)
              for tag in a_tags:
                  p_tags = tag.find_all('p')
                  safe_append(title_list, 0, p_tags)
                  safe_append(barcode_list, 1, p_tags)
                  safe_append(category_list, 2, p_tags)
                  safe_append(manufacturer_list, 3, p_tags)
      
              url = base_url + item_to_find + '/'
      
          return (title_list, barcode_list, category_list, manufacturer_list)
      
      
      def safe_append(list_to_append, tag_index, p_tags, default_to='NaN'):
          try:
              list_to_append.append(p_tags[tag_index].contents[0])
          except:
              list_to_append.append(default_to)
      
          return list_to_append
      

      【讨论】:

      • 感谢您的解释。我现在明白这个问题了
      猜你喜欢
      • 2013-05-14
      • 2020-08-04
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2019-04-11
      相关资源
      最近更新 更多