Как исправить скребок, повторяющий многочисленные теги контейнера, но выводящий только один - PullRequest
0 голосов
/ 04 мая 2019

Я построил скребок, и, хотя он, кажется, вытягивает правильный HTML, когда я перебираю теги контейнера, кажется, что он извлекает только одну запись. Я новичок, так что я надеюсь, что упустил что-то простое, но пара часов исследований поставили меня в тупик.

Я искал решение и убедился, что оно действительно извлекает весь необходимый мне HTML-код. Однако когда я запускаю этот код в конце, я получаю только один результат вместо всех. То же самое, когда я экспортирую в .csv.

print("product_name: " + product_name)
print("product_number: " + product_number)
print("category: " + category)

Вот соответствующий бит кода:

containers = page_soup.findAll("tr",{"class":"Product"})

for container in containers:

    product_name = container.a.text

    product_number = container.div.text

    category_container = container.select_one('td:nth-of-type(4)').text.strip()
    category = category_container

Я бы ожидал получить более 1000 продуктов, но вместо этого я получил только один. Что мне не хватает? Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 04 мая 2019

Переменные product_name, product_number, category могут хранить только одно значение - последнее значение из цикла.

Таким образом, вы можете использовать print() внутри цикла для просмотра значений

import csv

f = open(filename, 'w')
csv_writer = csv.writer(f)

# header
csv_writer.writerow( ["Product Name", "Product number", "Category"] ) 

for container in containers:
    product_name = container.a.text
    product_number = container.div.text
    category = container.select_one('td:nth-of-type(4)').text.strip()

    # single row 
    csv_writer.writerow( [product_name, product_number, category] ) 

    print("product_name:", product_name)
    print("product_number:", product_number)
    print("category: ", category)

f.close()

Или вам нужно создать список и использовать append() для добавления значений в список

product_name = []
product_number = []
category = []

for container in containers:
    product_name.append( container.a.text )
    product_number.append( container.div.text )
    category.append( container.select_one('td:nth-of-type(4)').text.strip() )

#--- later ---

print("product_name:", product_name)
print("product_number:", product_number)
print("category: ", category)    


f = open(filename, 'w')
csv_writer = csv.writer(f)

# header
csv_writer.writerow( ["Product Name", "Product number", "Category"] ) 

for a, b, c in zip(product_name, product_number, category):
    # single row 
    csv_writer.writerow( [a, b, c] ) 

f.close()

РЕДАКТИРОВАТЬ: вы также можете сохранить его в виде списка со словарями

all_items = []    

for container in containers:
    item = {
        'product_name': container.a.text,
        'product_number': container.div.text,
        'category': container.select_one('td:nth-of-type(4)').text.strip(),
    }
    all_items.append(item)

# --- later ---

f = open(filename, 'w')
csv_writer = csv.writer(f)

# header
csv_writer.writerow( ["Product Name", "Product number", "Category"] ) 

for item in all_items:
    print("product_name:", item['product_name'])
    print("product_number:", item['product_number'])
    print("category: ", item['category'])    

    # single row 
    csv_writer.writerow( [item['product_name'], item['product_number'], item['category']] ) 

f.close()
...