Форум сайта python.su
Добрый день, всем!
Подскажите, пожалуйста, есть код
import urllib
from bs4 import BeautifulSoup
URL = ("https://jobs.tut.by/search/vacancy?text=Logistics&enable_snippets=true&"
"clusters=true¤cy_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' : 'ООО Поставки и логистика'
Офлайн
1. Напишите еще одну функцию, которая парсит вакансию и возвращает словарь вида
{'salary': 1500, ...}
table.find_all('div', class_='search-result-item')]
Отредактировано Stright (Авг. 24, 2017 16:34:41)
Офлайн
Поддерживаю Stright, можно списком.
import __hello__
Офлайн
Все, что могу, пока…)
import urllib
from bs4 import BeautifulSoup
import re
URL = ("https://jobs.tut.by/search/vacancy?text=Logistics&enable_snippets=true&"
"clusters=true¤cy_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': 'ООО Прод Логистика'}
Офлайн
В вашем варианте вы находите таблицу с вакансиями, затем в цикле печатаете все зарплаты, сохраняя последнюю зарплату в переменной 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 }
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
Отредактировано Stright (Авг. 24, 2017 22:57:03)
Офлайн
Что-то получилось, но в конце лишние значения…
А как от них избавиться….??? Оставить только одни значения???
Вот код…
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"/>
Офлайн
Как обычно, re
...ВАШ КОД for vacancy in vacancies: vacancy = re.sub(r'(\<(/?[^>]+)>)|\[|\]|\\u2062', '', str(vacancy)) vacancy = re.sub(r'\\xa0', ' ', vacancy) print(vacancy) ...ВАШ КОД
import __hello__
Отредактировано delvin-fil (Авг. 29, 2017 05:42:37)
Офлайн
Спасибо!!!
Правда, значение зарплаты убирает)
Отредактировано Antonpython (Авг. 29, 2017 20:31:02)
Офлайн
Дописал так
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)
Офлайн
И еще… в примере
text = '[ < meta content = "400" itemprop = "baseSalary" / >]' print(text.split('"')[1])
Офлайн