Как мне отсортировать данные из сайта?

Учусь парсить сайт 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 шт):

Автор решения: qwe11Lk

Решение:

Просто парсите то, что вам нужно. Вы нашли при помощи имени класса элемент с данными о просмотрах, откликах и времени публикации, у каждого из них есть свои классы, вам просто нужно парсить не все данные из элемента с классом 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, значит он одобрен, то есть вы можете уже извлекать код страницы и парсить.

→ Ссылка