Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 24, 2017 15:27:00

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Добрый день, всем!
Подскажите, пожалуйста, есть код

import urllib
from bs4 import BeautifulSoup

URL = ("https://jobs.tut.by/search/vacancy?text=Logistics&enable_snippets=true&"
"clusters=true&currency_code=BYR&area=16&only_with_salary=true&from=cluster_compensation")

def get_html(url):
response = urllib.request.urlopen(url)
return response.read()

def parse(html):
soup = BeautifulSoup(html, "lxml")
table = soup.find('table', class_='l l_auto')

projects = []

for row in table.find_all('div', class_='b-vacancy-list-salary'):
cols = (row.find_all('meta', itemprop='baseSalary'))
print(cols[-1]['content'])
print('Salary_______________________________________________________\n')

for row in table.find_all('div', class_='search-result-item__info'):
cols = (row.find_all('span', class_ ='b-vacancy-list-date'))
print(cols[0].text)
print('Date_______________________________________________________\n')

for row in table.find_all('div', class_='search-result-item__info'):
cols = (row.find_all('span', class_ ='searchresult__address'))
print(cols[0].text)
print('Region_______________________________________________________\n')

for row in table.find_all('div', class_='search-result-item__company'):
print(row.text.strip())
print('Company_______________________________________________________\n')

projects.append({
'Salary': (cols[-1]),
'Date': [],
'Region':[],
'Company': []

})

for project in projects:
print(project)


def main():
parse(get_html(URL))

if __name__ == '__main__':
main()


Хочу чтобы выводило в консоль что-то похожее на:
 'Salary': '1500'  'Date':  '18 августа' 'Region': 'Москва' 'Company' : 'ООО Поставки и логистика'
И так далее шло объединение вниз…

Подскажите, пожалуйста, как это прописать. потому что не могу дальше продвинуться…
Дальше все это буду пробовать загонять в csv

Офлайн

#2 Авг. 24, 2017 16:30:40

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

1. Напишите еще одну функцию, которая парсит вакансию и возвращает словарь вида

 {'salary': 1500, ...}
2. Находите все вакансии в методе parse
 table.find_all('div', class_='search-result-item')]
ну или примерно так
3. В цикле парсите вакансии, добавляя результаты в список projects

Отредактировано Stright (Авг. 24, 2017 16:34:41)

Офлайн

#3 Авг. 24, 2017 17:53:09

delvin-fil
Зарегистрирован: 2015-11-27
Сообщения: 95
Репутация: +  4  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Поддерживаю Stright, можно списком.



 import __hello__

Офлайн

#4 Авг. 24, 2017 21:34:33

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Все, что могу, пока…)

import urllib
from bs4 import BeautifulSoup
import re

URL = ("https://jobs.tut.by/search/vacancy?text=Logistics&enable_snippets=true&"
"clusters=true&currency_code=BYR&area=16&only_with_salary=true&from=cluster_compensation")

def get_html(url):
response = urllib.request.urlopen(url)
return response.read()

def parse(html):
soup = BeautifulSoup(html, "lxml")
table = soup.find('table', class_='l l_auto')

projects = []

for row in table.find_all('div', class_='b-vacancy-list-salary'):
salary = (row.find_all('meta', itemprop='baseSalary'))
print(salary[-1]['content'])
print('Salary_______________________________________________________\n')


for row in table.find_all('div', class_='search-result-item__info'):
date = (row.find_all('span', class_ ='b-vacancy-list-date'))
print(date[0].text)
print('Date_______________________________________________________\n')

for row in table.find_all('div', class_='search-result-item__info'):
region = (row.find_all('span', class_ ='searchresult__address'))
print(region[0].text)
print('Region_______________________________________________________\n')

for row in table.find_all('div', class_='search-result-item__company'):
print(row.text.strip())
print('Company_______________________________________________________\n')

projects.append({
'Salary': (salary[-1]['content']),
'Date': (date[0].text),
'Region':(region[0].text),
'Company':(row.text.strip())

})

for project in projects:
print(project)


def main():
parse(get_html(URL))

if __name__ == '__main__':
main()


Выводит в конце
{'Salary': '1000', 'Date': '23\xa0августа', 'Region': 'Минск', 'Company': 'ООО Прод Логистика'}
Но нужно, чтобы сконкатенировало по данному образцу весь список….

Пока уперся, не понимаю, как прописать первый пункт.
Подскажите, пожалуйста, как этого достичь…

Офлайн

#5 Авг. 24, 2017 22:55:43

Stright
От: Кострома
Зарегистрирован: 2015-01-20
Сообщения: 139
Репутация: +  16  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

В вашем варианте вы находите таблицу с вакансиями, затем в цикле печатаете все зарплаты, сохраняя последнюю зарплату в переменной salary, то же самое вы делаете с другими данными по вакансии. В итоге вы получаете salary, date, region и company по только по последней вакансии, данные по остальным вакансиям вы просто печатаете, причем сначала все зарплаты, потом все даты и т.д.

Вам надо написать функцию, которая парсит одну вакансию:

 def parse_vacancy(elem):
    salary = elem.find(...).text
    date = elem.find(...).text
    region = elem.find(...).text
    company = elem.find(...).text
    return {
        'salary': salary,
        'date': date,
        'region': region,
        'company': company
    }
Затем в методе parse распарсить все вакансии:
 def parse(html):
    soup = BeautifulSoup(html, "lxml")
    table = soup.find('table', class_='l l_auto')
    result = []
    vacancies = table.find_all('div', class_='search-result-item')
    for elem in vacancies:
        result.append(parse_vacancy(elem))
    return result
То есть вы находите все вакансии и в цикле каждую вакансию передаете в функцию parse_vacancy, результат
добавляете в список с результатами

Отредактировано Stright (Авг. 24, 2017 22:57:03)

Офлайн

#6 Авг. 28, 2017 23:34:59

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Что-то получилось, но в конце лишние значения…

А как от них избавиться….??? Оставить только одни значения???


Вот код…

 import urllib
from bs4 import BeautifulSoup
URL = 'https://jobs.tut.by/search/vacancy?text=%D0%9B%D0%BE%D0%B3%D0%B8%D1%81%D1%82&only_with_salary=false&area=16&enable_snippets=true&clusters=true&salary='
def get_html(url):
    response = urllib.request.urlopen(url)
    return response.read()
def parse(html):
    soup = BeautifulSoup(html, "lxml")
    table = soup.find('table', class_='l l_auto')
    vacancies = []
    for row in table.find_all('div', class_='search-result-description__item search-result-description__item_primary'):
        nazv = row.find_all('div', class_='search-result-item__head')
        region = row.find_all('span', class_='searchresult__address')
        date = row.find_all('span', class_='b-vacancy-list-date')
        company = row.find_all('div', class_='search-result-item__company')
        salary = row.find_all('meta', itemprop='baseSalary')
        vacancies.append({
            'vacancy': nazv[0].a.text,
            'region': region[0].text,
            'date':(date[0].text),
            'company': company[0].a.text.strip(),
            # 'salary' : salary[-1]['content']
            'salary': salary
        })
    for vacancy in vacancies:
        print(vacancy)
def main():
    parse(get_html(
        URL))
if __name__ == '__main__':
    main()



Выводит

{'vacancy': 'Специалист \u2062по логистике', 'region': 'Минск, Фрунзенская', 'date': '27\xa0августа', 'company': 'ООО Инстар Лоджистикс Групп', 'salary': [<meta content="500" itemprop="baseSalary"/>]}
{'vacancy': 'Специалист по сн\u2062абжению (логист)', 'region': 'Минск', 'date': '23\xa0августа', 'company': 'ИП Оазис Груп', 'salary': []}
{'vacancy': 'Специалист по \u2062логистике и ВЭД', 'region': 'Минск, Восток и еще 1 ', 'date': '24\xa0августа', 'company': 'ООО Нова Систем', 'salary': []}
{'vacancy': 'Специалист п\u2062о маркетингу', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'УП Адани', 'salary': []}
{'vacancy': 'Лог\u2062ист', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'ИП Головатов Е.С', 'salary': [<meta content="500" itemprop="baseSalary"/>]}
{'vacancy': 'Экспедитор - Логист /\u2062 Менеджер по логистике', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'ООО ГАЛЛАРДО', 'salary': [<meta content="400" itemprop="baseSalary"/>]}
{'vacancy': 'Специалист по организации междунар\u2062одных перевозок (логист-экспедитор)', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'БЕЛПРУСС', 'salary': [<meta content="400" itemprop="baseSalary"/>]}
{'vacancy': 'Специалист по продаже транспор\u2062тных услуг / Логист-экспедитор', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'Белеврологистик-ТЦ', 'salary': [<meta content="250" itemprop="baseSalary"/>]}
{'vacancy': 'Специалист \u2062по логистике', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'ООО Корпоративный стандарт', 'salary': [<meta content="1200" itemprop="baseSalary"/>]}
{'vacancy': 'Специалист по ло\u2062гистике и сервису', 'region': 'Минск', 'date': '28\xa0августа', 'company': 'ИП Филуэт', 'salary': []}
{'vacancy': 'Диспетче\u2062р-логист', 'region': 'Минск', 'date': '25\xa0августа', 'company': 'ООО ОМА', 'salary': []}
{'vacancy': 'Специалист \u2062по логистике', 'region': 'Минск', 'date': '27\xa0августа', 'company': 'КЛМ', 'salary': []}
{'vacancy': 'Менеджер п\u2062о логистике', 'region': 'Минск, Петровщина', 'date': '26\xa0августа', 'company': 'МУК-Компьютерс', 'salary': []}
{'vacancy': 'Менеджер по перевозка\u2062м (логист-экспедитор)', 'region': 'Минск', 'date': '21\xa0августа', 'company': 'TSP', 'salary': []}
{'vacancy': 'Специалист \u2062по логистике', 'region': 'Минск', 'date': '23\xa0августа', 'company': 'ООО Битарел', 'salary': []}
{'vacancy': 'Логист / Менеджер по логистике / С\u2062пециалист по транспортной логистике', 'region': 'Минск, Малиновка', 'date': '21\xa0августа', 'company': 'ТЭК Трансавиатур', 'salary': []}
{'vacancy': 'Логист (специалист по аре\u2062нде строительной техники)', 'region': 'Минск', 'date': '18\xa0августа', 'company': 'ОДО Высокий замок', 'salary': []}
{'vacancy': 'Логист-э\u2062кспедитор', 'region': 'Минск', 'date': '7\xa0августа', 'company': 'ООО Трак экспедишн', 'salary': []}
{'vacancy': 'Логист / Специалист по о\u2062рганизации грузоперевозок', 'region': 'Минск', 'date': '11\xa0августа', 'company': 'НП-Сервис Логистика', 'salary': [<meta content="650" itemprop="baseSalary"/>]}
{'vacancy': 'Оператор TMS (лог\u2062ист по транспорту)', 'region': 'Минск', 'date': '9\xa0августа', 'company': 'Караван', 'salary': [<meta content="900" itemprop="baseSalary"/>]}

Подскажите, пожалуйста, как убрать
  <meta content=itemprop="baseSalary"/>
???!!!

Офлайн

#7 Авг. 29, 2017 02:31:00

delvin-fil
Зарегистрирован: 2015-11-27
Сообщения: 95
Репутация: +  4  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Как обычно, re

 ...ВАШ КОД
for vacancy in vacancies:
        vacancy = re.sub(r'(\<(/?[^>]+)>)|\[|\]|\\u2062', '', str(vacancy))
        vacancy = re.sub(r'\\xa0', ' ', vacancy)
        print(vacancy)
...ВАШ КОД

UPD: Это легко гуглится - “регулярное выражение убрать теги”



 import __hello__

Отредактировано delvin-fil (Авг. 29, 2017 05:42:37)

Офлайн

#8 Авг. 29, 2017 20:29:33

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Спасибо!!!
Правда, значение зарплаты убирает)

Отредактировано Antonpython (Авг. 29, 2017 20:31:02)

Офлайн

#9 Авг. 29, 2017 22:12:21

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

Дописал так

vacancies = []
lookfor = r"[\d]"
for row in table.find_all('div', class_='search-result-description__item search-result-description__item_primary'):
nazv = row.find_all('div', class_='search-result-item__head')
region = row.find_all('span', class_='searchresult__address')
date = row.find_all('span', class_='b-vacancy-list-date')
company = row.find_all('div', class_='search-result-item__company')
salary = row.find_all('meta', itemprop='baseSalary')
results = re.findall(lookfor, str(salary))

vacancies.append({
'vacancy': nazv[0].a.text,
'region': region[0].text,
'date':(date[0].text),
'company': company[0].a.text.strip(),
# 'salary' : salary[-1]['content']
'salary': results
})


Но выводит

 'salary': '4', '0', '0'

опять лишние верхние кавычки и запятые…

Отредактировано Antonpython (Авг. 29, 2017 22:13:16)

Офлайн

#10 Авг. 29, 2017 22:40:19

Antonpython
Зарегистрирован: 2017-02-14
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Как объединить строки вывода последовательно в одну строку

И еще… в примере

 text = '[ < meta content = "400" itemprop = "baseSalary" / >]'
print(text.split('"')[1])

выводится 400
а как это использовать в моем коде, я не могу догадаться… подскажите, пожалуйста, как это сделать…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version