从for循环访问索引并使用它创建新列表的问题

时间:2018-11-20 16:01:17

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

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

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

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

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

有人可以向我解释(如果可能的话,用一种易于理解的语言!)出了什么问题,怎么解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:1)

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

因此,代替此:

    vacancydetails[index]=[]

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

    vacancydetails.append([])

答案 1 :(得分:0)

列表vacancydetails为空,直到您将其追加(或从其他位置分配)为止。由于index从0开始计数,因此您只想在vacancydetails循环中的for p中处理当前最后的条目。

因此,您想要vacancydetails[index]=[]而不是vacancydetails.append([])。但是,更棘手的事情是使用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)