首页 > 解决方案 > 通过将字典放在列表中来破坏我的代码。我究竟做错了什么?

问题描述

我为一家超市的网站制作了一个网络爬虫。它相信我做的一切都是正确的,但不知何故,我在使用 for 循环时搞砸了在列表中使用字典。我的代码甚至不再打印文本,我自己也找不到解决方案。

我尝试在代码中的不同位置将一个空的 dic 放在循环之外,但这似乎都失败了。我尝试将简单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()

输出:

We did it boys. Proceeding with products ..

1444 items found on page.

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

[]

我正在尝试从字典列表中的独特产品中获取所有信息。之后,我会将此信息写入 csv 文件(正在编写代码)。我也将开始使用 Pandas。

如果您对构建我的代码或其他任何内容有任何提示,请随时分享。感谢您的帮助。

标签: python-3.xfor-loopselenium-webdriverweb-scraping

解决方案


P_LIST.append(newdict)在除条件之后和之前移动它print("-----------------------------------")

上面代码中的 P_LIST 的值在第二次尝试中更新,除了 case,如果尝试除外失败,您将不会在 P_LIST 中附加任何值。

(建议)还要在代码中添加一些调试日志,以便将来更好地调试。


推荐阅读