我有一个汽车品牌和车型的样本列表,要对其进行代码迭代和执行。
...
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循环来实现?
当前的问题是 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配对。 我希望你能从这里完成。
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)