проблема с доступом к индексу из цикла for и использованием его для создания нового списка - PullRequest
0 голосов
/ 20 ноября 2018

Я очень плохо знаком с 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 голосов
/ 20 ноября 2018

Поскольку vacancydetails является списком, попытка получить доступ к позиции в списке, который не существует, является ошибкой.И, когда вы впервые создаете его, список пуст.Таким образом, прежде чем получить доступ к любым элементам из списка, вам необходимо сначала создать этих элементов.

Таким образом, вместо этого:

    vacancydetails[index]=[]

...вы хотите добавить новый элемент в список (и этот новый элемент оказывается самим пустым списком), например:

    vacancydetails.append([])
0 голосов
/ 20 ноября 2018

Список 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...