Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2021 18:49:48

garlik
Зарегистрирован: 2021-02-27
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

Пишу парсер ria.com. Не получается достать нужные данные со страницы, помогите, плиз

Вот код:

 import requests
from bs4 import BeautifulSoup
URL = 'https://auto.ria.com/car/daewoo/'
HEADERS = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0', 'accept': '*/*'}
def get_html(url, params=None):
    r = requests.get(url, headers=HEADERS, params=params)
    return r
def get_content(html):
    soup = BeautifulSoup(html, 'html.parser')
    items = soup.find_all('section', class_='ticket-item')
    cars = []
    for item in items:
        price_uah = item.find('span', class_='i-block')
        if price_uah:
            price_uah = price_uah.get_text()
        else:
            price_uah = 'Не указано'
        cars.append({
            'title': item.find('div', class_='item ticket-title').get_text(strip=True),
            'link': item.find('a', class_='address').get('href'),
            'price_usd': '$' + item.find('span', class_='green').get_text(),
            'price_uah': item.find('span', class_='i-block').get_text(strip=True),
            'car_mileage': item.find('li', class_='js-race').get_text(strip=True),
            'location': item.find('li', class_='js-location').get_text(strip=True).replace('(от)',''),
#            'fuel': item.find_all('li', class_='item-char').get_text(strip=True)
        })
    print(cars)
    print(len(cars))
def parse():
    html = get_html(URL)
    if html.status_code == 200:
        get_content(html.text)
    else:
        print('Error в def parse')
parse()

Проблема в закомментированной строчке. Ей я пытаюсь достать тип топлива, на котором работает автомобиль. Я не понимаю как достать данные из тега <i> с классом icon-fuel (аналогично с типом коробки передач для i с классом icon-akp):

Как видно на скриншоте выше, у родительского (правильно употребил термин?) тега <li> стоит класс item-char, по которому я могу получить данные, но так как такой класс еще у трех тегов, то данные я получаю из первого (пробег), а надо из третьего (четвертого для типа коробки передач).

Вопросы:
Возможно ли достать данные напрямую из тега <i>?Если да, то как?
Если нет, то как достать данные из третьего (четвертого) <li> в примере?
Как это сделал бы грамотный/опытный специалист?

Большое спасибо всем, не прошедшим мимо)

Офлайн

#2 Фев. 27, 2021 20:17:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9880
Репутация: +  853  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

garlik
Я не понимаю как достать данные из тега <i> с классом icon-fuel (аналогично с типом коробки передач для i с классом icon-akp)
Эти данные к тегу i не относятся, они после него идут в виде текстового узла документа.

  
>>> import bs4
>>> 
>>> text = """\
... <ul class="list">
...   <li class="item">
...     ::marker
...     <i class="text"></i>
...     Текст
...   </li>
... </ul>
... """
>>> 
>>> soup = bs4.BeautifulSoup(text, 'html.parser')
>>> li = soup.find('li')
>>> text = tuple(li)[-1].strip()
>>> text
'Текст'
>>>



Офлайн

#3 Фев. 28, 2021 00:24:24

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1370
Репутация: +  121  -
Профиль   Отправить e-mail  

Нужна помощь с парсером

 'fuel': item.find_all('li')[2].get_text(strip=True),
'transmission':item.find_all('li')[3].get_text(strip=True)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version