Python 3 - выпуск метода вызова класса вне класса - PullRequest
0 голосов
/ 26 апреля 2018

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

У меня есть полностью рабочий скребок, который я хотел переписать с использованием ООП, но у меня возникают проблемы при вызове одного метода класса вне класса (все внутри цикла for). Любая помощь будет высоко ценится.

Мой код:

class IndeedScraper(object):
    def __init__(self, role, max_pages):
        self.role = role
        self.max_pages = max_pages
        self.url = "https://ie.indeed.com/jobs?as_and={}&radius=25&l=Dublin&fromage=3&limit=50&sort=date".format(role)

    # Finds number of pages resulting from search term provided
     def find_pages(self):

        return pages   # Returns a List of URLs

    # Parses relevant information from each page    
    def find_info(self):

      return l    # Returns a List of Dictionaries with the parsed information

if __name__ == '__main__':

    role = str(input("Enter role to search: "))
    max_pages = int(input('Enter number of pages to scrape: '))

    scraper = IndeedScraper(role, max_pages)

    l_main = []
    pages = scraper.find_pages()

    for i in pages[:max_pages]:
        html_page = urllib.request.urlopen(i)
        source = BeautifulSoup(html_page, "html5lib")
        print("Scraping Page number: " + i)
        results = scraper.find_info(source)  # THIS IS WHERE I DON'T KNOW HOW TO CALL THE 'find_info' function to make it work
        l_main.extend(results)

    # Put all results into a DataFrame
    df = pd.DataFrame(l_main)
    df = df[['Date', 'Company', 'Role', 'URL']]
    df=df.dropna()
    df.sort_values(by=['Date'], inplace=True, ascending=False)
    df.to_csv("csv_files/pandas_data.csv", mode='a', header=True, index=False)

Отображаемая ошибка:

Traceback (most recent call last):
  File "class_indeed_TEST.py", line 99, in <module>
    df = df[['Date', 'Company', 'Role', 'URL']]
  File "/usr/local/lib/python3.4/dist-packages/pandas/core/frame.py", line 2133, in __getitem__
    return self._getitem_array(key)
  File "/usr/local/lib/python3.4/dist-packages/pandas/core/frame.py", line 2177, in _getitem_array
    indexer = self.loc._convert_to_indexer(key, axis=1)
  File "/usr/local/lib/python3.4/dist-packages/pandas/core/indexing.py", line 1269, in _convert_to_indexer
    .format(mask=objarr[mask]))
KeyError: "['Date' 'Company' 'Role' 'URL'] not in index"

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема в функции find_pages. Вот оригинальная функция find_pages, которую вы опубликовали:

# Finds number of pages resulting from search term provided
 def find_pages(self):
    pages = []
    html_page = urllib.request.urlopen(self.url)
    source = BeautifulSoup(html_page, "html5lib")
    base_url = 'https://ie.indeed.com'
    for a in source.find_all('div', class_= 'pagination'):
      for link in a.find_all('a', href=True):
        pages.append(base_url + link['href'])
    pages.insert(0, base_url + '/jobs?q=test&l=Dublin&sort=date&limit=50&radius=25&start=0')
    pages.pop()
    return pages

Когда вы вызываете скрипт для роли "qa", сайт возвращает все результаты на одной странице . Поэтому на странице нет div'ов с class=pagination. Итак, эта строка возвращает пустой список:

for a in source.find_all('div', class_='pagination'):

... что означает, что это также пусто:

    for link in a.find_all('a', href=True):

поэтому вы возвращаете пустой список из функции find_pages, и в конечном итоге pandas создает пустой фрейм данных.

Чтобы исправить это, просто добавьте условие, чтобы проверить, пуст ли div для нумерации страниц, например:

# Finds number of pages resulting from search term provided
def find_pages(self):
    pages = []
    html_page = urllib.request.urlopen(self.url)
    source = BeautifulSoup(html_page, "html5lib")
    base_url = 'https://ie.indeed.com'

    # <edited code>
    pagination_divs = source.find_all('div', class_='pagination')
    if not pagination_divs:
        return [base_url + '/jobs?q={}&l=Dublin&sort=date&limit=50&radius=25&start=0'.format(self.role)]

    for a in pagination_divs:
        for link in a.find_all('a', href=True):
            pages.append(base_url + link['href'])
    # </edited code>

    pages.insert(0, base_url + '/jobs?q=test&l=Dublin&sort=date&limit=50&radius=25&start=0')
    pages.pop()
    return pages

Примечание: вам может понадобиться отредактировать код, чтобы сделать что-то еще, когда div не существует в зависимости от того, чего вы пытаетесь достичь.

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