Python。使用for循环来迭代一个类别和子类别的列表。类型错误:必须是str,而不是list。

问题描述 投票:0回答:1

我有一个汽车品牌和车型的样本列表,要对其进行代码迭代和执行。

...
makes = ['Ford', 'Audi']
ford_models = ['C-MAX', 'Focus']
audi_models = ['A3', 'A4']
models = [ford_models, audi_models]

base_url = "https://www.donedeal.ie/cars/"

程序代码。

#Go through a make in the list along with all its models 
#and then move onto the second make and all its models and so on..

for make in makes: 
    for model in models:
       for response in range(0,58,29):
            headers = {
                'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
            response = requests.get(base_url + make + "/" + model + "?start=" + str(response), headers=headers)
            soup = BeautifulSoup(response.text, 'html.parser')

            ...

我想让程序先以福特为品牌,首先运行C -MAX的所有代码,然后回到循环中,运行福克斯的所有代码。在完成Focus之后,我想让它将make改为Audi,并运行Audi车型(先运行A3,再运行A4)。我做了一个尝试,但得到一个错误。

response = requests.get(base_url + make + "/" + model + "?start=" + str(response), headers=headers)
TypeError: must be str, not list

我如何解决这个错误,并使用for循环来实现?

python list loops screen-scraping
1个回答
2
投票

当前的问题是 model 是一个模型的列表,而不是单个模型的名称。 你忽略了对你的操作进行任何基本的跟踪。

for make in makes: 
    for model in models:
        print (make, model)

将向您展示逻辑问题。

您需要将您的模型键入到make中。 用dict。

make_model {
    'Ford': ['C-MAX', 'Focus'],
    'Audi':  ['A3', 'A4']
}

for make in make_model:
    for model in make_model[make]:

这个... 会按照你的要求迭代你的makemodel配对。 我希望你能从这里完成。


3
投票

models 是列表,而不是组合模型的列表。

models = ford_models + audi_models

(虽然正如 @Prune 指出的,你可能不想组合模型,而是在每次迭代时使用一个单独的 make-specific list。我在这里就不都重复了)。)

另外,让 requests 为您建立URL,而不是手工编码查询字符串。

url_template = "https://www.donedeal.ie/cars/{}/{}"
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'
}

for make, model in itertools.product(makes, models):
    url = url_template.format(make, model)
    response = requests.get(url, params={'start': str(response)}, header=headers)
© www.soinside.com 2019 - 2024. All rights reserved.