Как исправить ошибку «Список индексов вне диапазона» при извлечении номеров первой и последней страниц в моей программе очистки веб-страниц? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь создать свой первый веб-скребок Python для автоматизации одного задания на работу - мне нужно записать все вакансии с этого сайта (только для здоровья) в файл Excel. Используя учебник, я разработал следующую программу.

Однако на шаге 6 я получаю сообщение об ошибке: IndexError: list index out of range.

Я попытался использовать start_page = paging[2].text, так как я думал, что первая страница может быть базовой страницей, но это приводит к той же ошибке.

Вот шаги, которые я выполнил:

  1. Я проверил, что веб-сайт https://iworkfor.nsw.gov.au позволяет очищать

  2. Импортированы необходимые библиотеки:

    import requests  
    from bs4 import BeautifulSoup  
    import pandas  
    
  3. сохраняет URL-адрес как переменную:

    base_url = "https://iworkfor.nsw.gov.au/nsw-health-jobs?divisionid=1"

  4. Получить содержимое HTML:

    r = requests.get(base_url)` 
    c = r.content
    
  5. Разбор HTML

    soup = BeautifulSoup(c,"html.parser")

  6. Для извлечения номера первой и последней страницы

    paging = soup.find("div",{"class":"pana jobResultPaging tab-paging-top"}).find_all("a")  
    
    start_page = paging[1].text  
    
    last_page = paging[len(paging)-2].text  
    
  7. Создание пустого списка для добавления всего содержимого:

    web_content_list = []

  8. Создание ссылок на страницы из номеров страниц, пролистывание страниц и извлечение содержимого из соответствующих тегов

    for page_number in range(int(start_page),int(last_page) + 1):   
    
        # To form the url based on page numbers  
        url = base_url+"&page="+str(page_number)  
    
        r = requests.get(base_url+"&page="+str(page_number))  
    
        c = r.content  
    
        soup = BeautifulSoup(c,"html.parser")  
    
  9. Чтобы извлечь заголовок

    vacancies_header = soup.find_all("div", {"class":"box-sec2-left"})

  10. Чтобы извлечь LHD, тип задания и номер задания

    vacancies_content = soup.find_all("div", {"class":"box-sec2-right"})

  11. Для обработки вакансии по вакансии с помощью цикла

    for item_header,item_content in zip(vacancies_header,vacancies_content):
    
       # To store the information to a dictionary
       web_content_dict = {}
    web_content_dict["Title"]=item_header.find("a").text.replace("\r","").replace("\n","")
       web_content_dict["Date Posted"] = item_header.find("span").text
    
       web_content_dict["LHD"] = item_content.find("h5").text
    
       web_content_dict["Position Type"] = item_content.find("p").text
    
       web_content_dict["Job Reference Number"] = item_content.find("span",{"class":"box-sec2-reference"}).text
    
      # To store the dictionary to into a list
       web_content_list.append(web_content_dict)
    
    
  12. Создать фрейм данных со списком

    df = pandas.DataFrame(web_content_list)

  13. Чтобы записать фрейм данных в CSV-файл

    df.to_csv("Output.csv")

В идеале программа запишет данные обо всех вакансиях в CSV-файл в виде удобной таблицы со столбцами: заголовок, дата публикации, LHD, тип должности, номер задания.

1 Ответ

0 голосов
/ 10 января 2019

Проблема в том, что ваш первоначальный вызов find() возвращает пустой <div>, и поэтому ваш последующий вызов find_all возвращает пустой список:

>div = soup.find("div",{"class":"pana jobResultPaging tab-paging-top"  
>div  
   <div class="pana jobResultPaging tab-paging-top">  
   </div>  
>div.find_all("a")
[]

Обновление:

Причина, по которой вы не можете проанализировать содержимое <div>, о котором идет речь (т. Е. Почему он пуст), связана с тем фактом, что данные, извлеченные с сервера, «разбиты на страницы» JavaScript-кодом на стороне клиента (код в вашем браузере). Ваш код Python анализирует только тот HTML-код, который возвращается запросом к iworkfor.nsw.gov.au; данные, которые вам нужны (и которые превращаются в «страницы»), запрашиваются тем же javascript и возвращаются сервером в формате, называемом JSON.

Итак, плохая новость заключается в том, что предоставленные вам инструкции не будут работать. Вам нужно будет проанализировать JSON, возвращенный сервером, и затем декодировать экранированный HTML, который он содержит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...