Beautifulsoup L oop экстракт повторяющийся - PullRequest
0 голосов
/ 17 января 2020

Ниже код извлекает данные со страницы Volkswagen https://www.kununu.com/de/volkswagenconsulting/kommentare

Однако я повторяюсь с несколькими пробами / исключениями. Я хотел бы создать новый l oop, который извлекает данные в arbeitsatmosphare = [], vorgesetztenverhalten = [], kollegenzusammenhalt= [] без повторения кода. Вы можете помочь?

import requests
from bs4 import BeautifulSoup
import pandas as  pd
import re




city = []
team = []
date = []
jobstatus=[]
overall=[]

satisfied=[]
company=[]

arbeitsatmosphare = []
vorgesetztenverhalten = []
kollegenzusammenhalt= []



lurl='https://www.kununu.com/de/volkswagenconsulting/kommentare'
with requests.Session() as session:
    session.headers = {
        'x-requested-with': 'XMLHttpRequest'
    }
    page = 1
    while True:
        print(f"Processing page {page}..")
        url = f'{lurl}/{page}'
        print(url)
        response = session.get(url)
        soup = BeautifulSoup(response.text, 'html.parser')
        # satisfied.append(satisfiedText)
        # firma = [x.text.strip() for x in soup.find_all('span', {'class': 'company-name'})]
        articles = soup.find_all('article')
        print("Number of articles: " + str(len(articles)))
        for article in articles:

            try:
                arbeitsatmosphareText = article.find('span', text=re.compile(r'Arbeitsatmosphäre')).find_next(
                    'span').text.strip()
                arbeitsatmosphare.append(arbeitsatmosphareText)
            except:
                arbeitsatmosphare.append('N/A')

            try:
                vorgesetztenverhaltenText = article.find('span',
                                                         text=re.compile(r'Vorgesetztenverhalten')).find_next(
                    'span').text.strip()
                vorgesetztenverhalten.append(vorgesetztenverhaltenText)
            except:
                vorgesetztenverhalten.append('N/A')

            try:
                kollegenzusammenhaltText = article.find('span', text=re.compile(r'Kollegenzusammenhalt')).find_next(
                    'span').text.strip()
                kollegenzusammenhalt.append(kollegenzusammenhaltText)
            except:
                kollegenzusammenhalt.append('N/A')


            companyText = soup.find('span', {'class': 'company-name'}).text.strip()
            company.append(companyText)

            satisfiedText = soup.find('span', {'class': 'review-recommend-value'}).text.strip()
            satisfied.append(satisfiedText)

            overallText = soup.find('span', {'class': 'review-rating-value'}).text.strip()
            overall.append(overallText)

        page += 1
        pagination = soup.find_all('div', {'class': 'paginationControl'})
        if not pagination:
            break

    df = pd.DataFrame({'Arbeitsatmosphäre': arbeitsatmosphare,
                       'Vorgesetztenverhalten': vorgesetztenverhalten,
                       'Kollegenzusammenhalt': kollegenzusammenhalt,
                        'Overall': overall,
                       'company': company,
                       'satisfied': satisfied

                       })

print(df)

1 Ответ

0 голосов
/ 17 января 2020

Не могли бы вы просто заменить try/except на некоторые условия?

Примерно так:

for key in [{'label': 'Arbeitsatmosphäre', 'list': arbeitsatmosphare}, {'label': 'Vorgesetztenverhalten', 'list': vorgesetztenverhalten},{'label': 'Kollegenzusammenhalt', 'list': kollegenzusammenhalt}]:
    span = article.find('span', text=re.compile(key['label']))
    if span and span.find_next('span'):
        key['list'].append(span.find_next('span').text.strip())
    else:
        key['list'].append('N/A')

Я только что протестировал этот фрагмент, кажется, у меня те же результаты, что и ваш код

...