我一般对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
有人可以向我解释(如果可能的话,用一种易于理解的语言!)出了什么问题,怎么解决这个问题?
谢谢!
答案 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)