Как мне отсортировать данные из сайта?
Учусь парсить сайт freelance.habr.com. все данные я получил в таком виде:
Создать RDP доступ на арендованный сервер
7 откликов 23 просмотра 37 минут назад
5 000 руб. за проект
Верстка одностраничного сайта на HTML+CSS3
17 откликов 64 просмотра ~ 1 час назад
договорная
...
но как мне убрать из строки отклики и просмотры. и как мне отсортировать в таком виде:
Задача: Создать RDP доступ на арендованный сервер
Дата: 37 минут назад
Цена: 5 000 руб. за проект
Задача: Верстка одностраничного сайта на HTML+CSS3
Дата: ~ 1 час назад
Цена: договорная
Вот как я пытаюсь это сделать:
listHtml = soup.find("ul")
#for i in listHtml.find_all("div", {"class": "task__title", "task__params"}):
for divs in listHtml.find_all("div", class_=["task__title", "task__params","task__price"]):
#for divs in listHtml.find_all("div", class_=["task__title"]):
line = divs.text
#listTitle.append(line)
print(line)
Может вообще лучше в словарь все эти данные добавить для сортировки?
Ответы (1 шт):
Решение:
Просто парсите то, что вам нужно. Вы нашли при помощи имени класса элемент с данными о просмотрах, откликах и времени публикации, у каждого из них есть свои классы, вам просто нужно парсить не все данные из элемента с классом task__params
. Например, у элемента, в котором указано время публикации есть класс params__published-at icon_task_publish_at
попробуйте найти только данный элемент и из него извлекать текст.
tasks = soup.find_all(class_="content-list__item")
for task in tasks:
title, date, price = (task.find(class_="task__title").text, task.find(class_="params__published-at").text, task.find(class_="task__price").text)
print(f"Задача: {title}\nДата: {date}\nЦена: {price}")
upd.2
Если вам нужно образовать данные в словарь, где ключ - задача, значение - цена и дата, то это можно реализовать данным способом:
tasks = soup.find_all(class_="content-list__item")
data = {}
for task in tasks:
title, date, price = (task.find(class_="task__title").text, task.find(class_="params__published-at").text, task.find(class_="task__price").text)
data = data | {
title:(date, price)
}
upd.3
Если при парсинге сайта возникает ошибка 404, и если при этом у вас правильно указан url адрес, то можете попробовать отправлять запрос с заголовками user-agent
, например:
import requests
#прописываем самостоятельно заголовки user-agent, т.к. при обычной отправке запроса он исходит с user-agent от python requests, что понимает сервер и может блокировать запрос
headers = {'User-Agent': 'Mozilla/5.0 (compatible; HandsomeBrowser/1.2)'}
r = requests.get("https://hh.ru/search/vacancy?area=11&professional_role=4&professional_role=5&professional_role=62&professional_role=70&withTopFilterCatalog=true", headers=headers)
print(r.status_code)
#теперь же возвращает статус запроса 200, следовательно, запрос одобрен
Если запрос получил статус 200, значит он одобрен, то есть вы можете уже извлекать код страницы и парсить.