List 当通过for循环将字典附加到列表时,我只得到最后一个字典

List 当通过for循环将字典附加到列表时,我只得到最后一个字典,list,python-3.x,for-loop,dictionary,web-scraping,List,Python 3.x,For Loop,Dictionary,Web Scraping,我试图通过浏览所有不同的页面来搜索一个职业搜索网站,当我试图使用for循环将字典添加到列表中时,我总是遇到问题。当我在Python3.4中执行下面的代码时,代码会将每个页面中的所有相关数据拉入一个字典(我已使用print()进行了检查),并附加到“FullJobDetails”中,但在for循环的末尾,我会得到一个列表,其中只包含最后一页中的所有字典。字典的数量与“ListofJobs”列表中的页数完全相同。“ListofJobs”是指向我要删除的每个页面的html链接列表 我刚开始学习代码,所

我试图通过浏览所有不同的页面来搜索一个职业搜索网站,当我试图使用for循环将字典添加到列表中时,我总是遇到问题。当我在Python3.4中执行下面的代码时,代码会将每个页面中的所有相关数据拉入一个字典(我已使用print()进行了检查),并附加到“FullJobDetails”中,但在for循环的末尾,我会得到一个列表,其中只包含最后一页中的所有字典。字典的数量与“ListofJobs”列表中的页数完全相同。“ListofJobs”是指向我要删除的每个页面的html链接列表

我刚开始学习代码,所以我知道下面的代码不是以任何形式、方式或形式最有效或最好的方式来完成的。如有任何建议,将不胜感激。提前谢谢

FullJobDetails = []
browser = webdriver.Chrome()
dictionary = {}

for jobs in ListofJobs:
  browser.get(jobs)
  dictionary["Web Page"] = jobs
  try:
    dictionary["Views"] = browser.find_element_by_class_name('job-viewed-item-count').text
  except NoSuchElementException:
    dictionary["Views"] = 0

  try:
    dictionary['Applicants'] = browser.find_element_by_class_name('job-applied-item-count').text
  except NoSuchElementException:
    dictionary["Applicants"] = 0

  try:
    dictionary["Last Application"] = browser.find_element_by_class_name('last-application-time-digit').text
  except NoSuchElementException:
    dictionary["Last Application"] = "N/A"

  try:
    dictionary["Job Title"] = browser.find_element_by_class_name('title').text
  except NoSuchElementException:
    dictionary["Job Title"] = "N/A"

  try:
    dictionary['Company'] = browser.find_element_by_xpath('/html/body/div[3]/article/section[2]/div/ul/li[4]/span/span').text
  except NoSuchElementException:
    dictionary['Company'] = "Not found"

  try:
    dictionary['Summary'] = browser.find_element_by_class_name('summary').text
  except NoSuchElementException:
    dictionary['Summary'] = "Not found"

  FullJobDetails.append(dictionary)

问题是您只创建了一个字典-dicitonaries是可变的对象-相同的dictionary会一次又一次地附加到列表中,并且在每次执行
for
循环时,您都会更新其内容。因此,在最后,您将拥有同一份目录的多份副本,所有副本均显示最后一页上的信息

只需为每次运行
for
循环创建一个新的dictionary对象。新字典将保存在列表中,变量名
dictionary
可以保存新对象,而不会发生冲突

for jobs in ListofJobs:
  dictionary = {} 
  browser.get(jobs)
  ...

问题是您只创建了一个字典-dicitonaries是可变的对象-相同的dictionary会一次又一次地附加到列表中,并且在每次执行
for
循环时,您都会更新其内容。因此,在最后,您将拥有同一份目录的多份副本,所有副本均显示最后一页上的信息

只需为每次运行
for
循环创建一个新的dictionary对象。新字典将保存在列表中,变量名
dictionary
可以保存新对象,而不会发生冲突

for jobs in ListofJobs:
  dictionary = {} 
  browser.get(jobs)
  ...

等等您使用真正的HTML解析器解析
job.content
,然后立即将其解压并使用正则表达式搜索原始文本?您确定所显示的代码就是您正在运行的代码吗?如果行
dict={}
在循环之外,而不是在显示它的位置,那么您描述的问题正是我所期望的。(与您的问题无关的一点:使用
dict
作为变量名是一个非常糟糕的主意。它会隐藏内置
dict
类的名称,这可能会在以后导致非常混乱的错误。)是的,显示的代码与正在运行的代码完全相同,“缩进”等等。如果它自己重置,我会想象列表中只有一个字典(最后一个),而不是多个都对应于最后一个字典的字典。谢谢你关于重命名dict的建议,我将把它改成另一个变量。请稍候。您使用真正的HTML解析器解析
job.content
,然后立即将其解压并使用正则表达式搜索原始文本?您确定所显示的代码就是您正在运行的代码吗?如果行
dict={}
在循环之外,而不是在显示它的位置,那么您描述的问题正是我所期望的。(与您的问题无关的一点:使用
dict
作为变量名是一个非常糟糕的主意。它会隐藏内置
dict
类的名称,这可能会在以后导致非常混乱的错误。)是的,显示的代码与正在运行的代码完全相同,“缩进”等等。如果它自己重置,我会想象列表中只有一个字典(最后一个),而不是多个都对应于最后一个字典的字典。谢谢你关于重命名dict的建议,我将把它改成另一个变量。这很有效!非常感谢您抽出时间回答这个问题。这很有效!非常感谢您抽出时间回答这个问题。