Взломать мой код, поместив словари в список.Что я делаю неправильно? - PullRequest
0 голосов
/ 20 сентября 2019

Я сделал веб-браузер для сайта супермаркета.Он полагал, что я все сделал правильно, но каким-то образом я испортил использование словарей в списках, используя цикл for.Мой код больше даже не печатает текст, и я сам не могу найти решение.

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

import time
import csv
from urllib.parse import urljoin
from selenium import webdriver


# csvFile = open('products.csv', 'w')
# writer = csv.writer(csvFile)
# writer.writerow(('name', 'price'))

pagenum = 1

base_url = 'https://www.ah.nl'
search_url = '/zoeken?query=groente&page={}'.format(pagenum)
active_url = urljoin(base_url,search_url)
driver = webdriver.Chrome()
driver.get(active_url)
driver.implicitly_wait(100)

next_page = driver.find_elements_by_tag_name('article')
total_products = driver.find_element_by_class_name('f-load-more')
T = total_products.text.split()
print(" Total products: " + str(T[3]))

var = len(next_page)-1
h = next_page[var]

while int(T[0]) < int(T[3]):
    try:
        time.sleep(1)
        driver.execute_script("arguments[0].scrollIntoView();", h)
        total_products.find_element_by_tag_name('button').click()
        time.sleep(1)

    except:
        print("We did it boys. Proceeding with products ..")
        break

def linkGrabber():
    items = driver.find_elements_by_tag_name('article')
    print(str(len(items)) + " items found on page.")
    urls = []
    for i in items:
        try:
            L = i.find_element_by_tag_name('a') .get_attribute('href')
            urls.append([L])
        except:
            print('link for' + str(i) + ' not found.')
    return urls

yum = linkGrabber()
# for practise purposes:
yum = yum[0:3]


P_LIST = []

for i in yum:
    newdict = {}
    i = "".join(i)
    driver.get(i)
    TITLE = driver.find_element_by_xpath('//*[@id="app"]/main').get_attribute('title')
    newdict["url"] = i
    newdict["name"] = TITLE
    try:
        x = driver.find_element_by_class_name('product-info-content-block')
        x = x.find_element_by_tag_name('p').text
        newdict["weight/amount"] = x
    except:
        continue
    try:
        NUTRITION_TABLE = driver.find_element_by_tag_name('tbody')
        ENERGY = NUTRITION_TABLE.find_elements_by_tag_name('tr')
        for i in ENERGY:
            A = i.find_elements_by_tag_name('td')
            UNIT = A[0].text
            VALUE = A[1].text
            newdict[UNIT] = VALUE
        P_LIST.append(newdict)

    except:
        continue

    print("-----------------------------------")

print(P_LIST)


# csvFile.close()

output:

We did it boys. Proceeding with products ..

1444 items found on page.

link for<selenium.webdriver.element> not found.

[]

Я пытаюсь собрать всю информацию из уникальных продуктов в списке словарей.После этого я запишу эту информацию в CSV-файл (код в процессе).Я также начну использовать Pandas.

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

1 Ответ

0 голосов
/ 20 сентября 2019

Переместить это P_LIST.append(newdict) после условия исключения и до print("-----------------------------------")

Значение P_LIST в приведенном выше коде обновляется во второй попытке, кроме случая, и если эта попытка, кроме неудачи, не будет добавлена, никакое значение не будет добавлено.в P_LIST.

(Предложение) Также добавьте несколько журналов отладки в свой код для лучшей отладки в будущем.

...