【问题标题】:problem with accessing index from for loop and using it to create a new list从 for 循环访问索引并使用它创建新列表的问题
【发布时间】:2018-11-20 16:01:16
【问题描述】:

我对 Python 和一般编程非常陌生(我基本上是几天前开始的),所以如果我使用了错误的术语或者我问了一个愚蠢的问题,请原谅我。

我正在编写一个网络爬虫来从一个职位空缺网站获取一些数据。我编写了一些代码,首先从主搜索结果页面下载数据,对其进行解析并从中提取标题,其中包含指向每个空缺页面的链接,可以找到每个特定空缺的详细信息。然后我编写了打开每个链接并解析每个空缺页面的 html 的代码。

现在这一切正常。我遇到的问题是以下问题。我想从每个空缺页面中抓取一些数据,并将每个空缺的数据保存在一个单独的列表中,以便稍后我可以将所有这些列表放入一个数据框中。因此,我一直在寻找一种方法来对每个列表进行编号或“索引”(如果这是正确的术语),以便我以后可以参考它们。以下是我目前拥有的代码。按照我通过阅读 Stackoverflow 上的现有答案找到的建议,我尝试使用 enumerate 创建一个可以分配给每个列表的索引,如下所示:

vacancy_headings = resultspage1_soup.body.findAll("a", class_ ="vacancy-link")

vacancydetails = []

for index, vacancy in enumerate(vacancy_headings, start=0):
    vacancypage_url = urljoin("https://www.findapprenticeship.service.gov.uk",vacancy["href"])
    vacancypage_client = urlopen(vacancypage_url)
    vacancypage_html = vacancypage_client.read()
    vacancypage_soup = soup(vacancypage_html, "html.parser")
    vacancydetails[index]=[]

    for p in vacancypage_soup.select("p"):
        if p.has_attr("itemprop"):
            if p["itemprop"] == "employmentType" or p["itemprop"] == "streetAddress" or p["itemprop"] == "addressLocality" or p["itemprop"] == "addressRegion" or p["itemprop"] == "postalCode":
                cells = p.text
                vacancydetails[index].append(cells)`

但我收到以下错误消息:

IndexError                                Traceback (most recent call last)
<ipython-input-10-b8a75df16395> in <module>() 
      9     vacancypage_html = vacancypage_client.read()
     10     vacancypage_soup = soup(vacancypage_html, "html.parser")
---> 11     vacancydetails[index]=[]
     12 
     13     for p in vacancypage_soup.select("p"):

IndexError: list assignment index out of range

谁能给我解释一下(如果可能的话,用通俗易懂的语言!)出了什么问题,我该如何解决这个问题?

谢谢!!

【问题讨论】:

  • vacancydetails.append([])?
  • enumerate(),默认从0开始;所以你不需要明确地做start=0

标签: python list for-loop indexing web-scraping


【解决方案1】:

由于vacancydetails 是一个列表,因此尝试访问列表中不存在的位置是错误的。而且,当您第一次创建它时,列表是空的。因此,在访问列表中的任何元素之前,您需要先创建这些元素。

因此,而不是这样:

    vacancydetails[index]=[]

...您想将一个 new 项目附加到列表中(并且该新项目本身恰好是一个空列表),如下所示:

    vacancydetails.append([])

【讨论】:

  • 谢谢,这很有帮助!我现在已经开始工作了。 :)
  • 我的荣幸!如果您觉得某个答案已经解决了您的问题,您可以通过单击答案旁边的复选标记图标将其标记为“已接受”来帮助未来可能遇到相同问题的人。 (More info here.) 如果给出的答案都没有解决您的问题,您可以添加自己的答案。
【解决方案2】:

列表vacancydetails 是空的,直到您附加到它(或从其他地方分配给它)。因为index 从0 开始计数,所以您只想在for p 循环中操作vacancydetails 中的当前最终条目。

所以,你想要vacancydetails.append([]),而不是vacancydetails[index]=[]。但更 Python 的做法是使用 vacancydetails 中的最后一个条目,即 vacancydetails[-1],在这种情况下,您永远不需要 index 变量。

for vacancy in vacancy_headings:
    vacancypage_url = urljoin("https://www.findapprenticeship.service.gov.uk",vacancy["href"])
    ### ...
    vacancydetails.append([])

    for p in vacancypage_soup.select("p"):
        if p.has_attr("itemprop"):
           ### ...
           vacancydetails[-1].append(cells)

【讨论】:

  • 感谢您的快速回复和解释。您建议的解决方案效果很好!
  • @SanneVelthuis,太好了——请为好的答案投票并接受一个正确的答案!
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2021-04-07
  • 2020-03-25
  • 2015-01-19
  • 2023-03-26
  • 2021-09-08
  • 2017-03-24
  • 1970-01-01
相关资源
最近更新 更多