1
votes

la longueur des listes n'est pas la même lors de l'ajout d'éléments

Je travaille sur un projet de web-scraping, dans lequel je dois rechercher un produit sur un site Web et ajouter tous les détails du produit aux listes respectives.

Par exemple, la première page de ce URL répertorie 10 produits avec le nom "CLOSE UP". Je dois ajouter le titre du produit à une liste, le code-barres du produit à une autre liste, etc.

Je dois également le faire pour plusieurs pages.

Ceci est mon code jusqu'à présent

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

Dans le code ci-dessus, j'utilise une condition essayez sauf pour ajouter les informations aux listes car tous les produits n'ont pas toutes les informations. Si les informations sont disponibles, ajoutez à la liste, ajoutez «NaN». c'est ce que le code devrait faire. Cela garantit que la longueur des listes reste la même partout.

Mais quand j'exécute le code suivant, la longueur des listes n'est pas la même.

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)

Je ne sais pas ce que je fais de mal.


0 commentaires

3 Réponses :


1
votes

Peut-être que ce qui se passe est votre essai: échoue à un moment donné et vous ajoutez d'autres éléments à l'exception de:

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')


0 commentaires

2
votes

Lors de votre essai, sauf si l'un des ajouts échoue, vous ajoutez NaN à chacun d'eux. Modifiez votre code avec ceci.

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')


1 commentaires

Merci d'avoir répondu. Je comprends maintenant ce que j'ai fait de mal.



1
votes

Le problème vient de votre logique try-except . Supposons que p_tags [3] n'existe pas. Vous avez déjà ajouté p_tags [0] .contents [0] , p_tags [1] .contents [0] , p_tags [2] .contents [0] et vous obtenez une exception indiquant que l'index de la liste est hors de portée. Dans la clause except , vous ajoutez à nouveau NaN aux quatre listes. Notez que vous avez ajouté la valeur réelle et NaN pour title_list , barcode_list , category_list .

Le correctif Cela dépend de ce que vous voulez. Un choix raisonnable serait d'ajouter NaN uniquement si vous ne parvenez pas à accéder à cette valeur particulière.

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


1 commentaires

Merci pour l'explication. Je comprends le problème maintenant