Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 2, 2019 08:03:42

ashimano
Зарегистрирован: 2016-06-07
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема парсить данные

Здравствуйте.
1. Заходим на сайт и видим данные так:
Название……….
Адрес: …….
Телефон: …………..
Часы работы: ……………..
Сайт: …………………
2. Проблема в том, что если название имеет свой класс ('title'), то адрес, телефон, часы работы и сайт написаны под одним и тем же классом.

 <div class="list-item hover  ">
		<h3><a href="сылка" title="Показать на карте"> Название организации</a></h3>
        
            <span class="rating"><i class='fa fa-star'></i><i class='fa fa-star'></i><i class='fa fa-star'></i><i class='fa fa-star'></i><i class='fa fa-star'></i></span>
        
		
		<div class="row">
			<div class="left">Адрес:</div>
			<div class="right">
				
				Россия, Москва...
			</div>
			<div class="clear"></div>
		</div>
		
		
		<div class="row">
			<div class="left">Телефон:</div>
			<div class="right">+7 (999) 999-00-12</div>
			<div class="clear"></div>
		</div>
		
		
		<div class="row">
			<div class="left">Часы работы:</div>
			<div class="right">ежедневно, 8:00–20:00</div>
			<div class="clear"></div>
		</div>
		
        
        
            <div class="row">
                <!--noindex-->
                <div class="left">Сайт:</div>
                <div class="right">
                    <span class="make-link" data-link="aHR0cDovL3d3dy4xMTJzdG8ucnU="></span>
                </div>
                <!--/noindex-->
                <div class="clear"></div>
            </div>
        
        
            <div class="row">
                <div class="left"><!--noindex-->Последний отзыв:<!--/noindex--></div>
                <div class="right">
                    <div>
                        <!--noindex-->
                        <i class="fa fa-commenting-o"></i>
                        <span class="review-meta">
                        
                            Евгения,
                        
                        05 апреля 2017
                        </span>
                        <!--/noindex-->
                    </div>
                    Заезжала на днях на мойку , заказала мойку ЛЮКС , Автомойщик рассказал что входит эту мойку и доброжелательно обьяснил как пройти в зал ...
                </div>
                <div class="clear"></div>
            </div>
        
	</div>

А теперь как выглядит часть моего кода
     ads = soup.find('div', class_='addresses-list').find_all('div', class_='list-item hover')
    for ad in ads:
        try:
            title = ad.find('a').text.strip()
        except:
            title = ''
        try:
            adress = ad.find('div', class_='right').text.strip().split('\t')[-1]
        except:
            adress = ''
        data = {'title':title,
                'adress':adress}
        write_csv(data)

Вот ‘right’ когда прописываю, выдает только адрес, а как дальше информацию парсить, если она под тем же классом? помогите пожалуйста)

Офлайн

#2 Июнь 2, 2019 08:21:44

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

Проблема парсить данные

Надо потом искать все row. Получить их и потом в цикле для каждого row искать в нём left и проверять название поля в тексте тега. Если название подходит, то надо в том же row искать right и брать его значение.

Я тебе так скажу: я такую фигню парсил и всё было нормально, пока на некоторых страницах не стали пропадать некоторые поля. Ну, например, нет телефона, так они не пустоту оставляли в поле телефона, а просто поле всё удаляли из выдачи. Так что если зафиксируешь скрипт на количество полей, то он может потом сломаться, когда какая-нибудь редкая страница окажется не такой, как все другие страницы.

И ещё, то, что ты спросил, относится к поиску сиблинга. Якобы тебе нужен сиблинг - это выглядит как решение. Но при парсинге HTML нужно избегать ориентировку по сиблингам, ориентировку по точным индексам. Там есть такая подлянка в HTML DOM - текстовые узлы в промежутках. Каждая пустота между узлами на самом деле является текстовым узлом, а у него есть свой индекс в списке узлов. И это всё ломает, когда ты хочешь просто по индексам узлы брать в документе.

Поэтому старайся искать по id и по class, потому что они от порядка не зависят. Так тебе меньше раз нужно будет подгонять свои скрипты обработки HTML, когда там на странице будет что-то меняться каждые три дня. У меня бывало такое, когда сайт менялся каждые три дня, хотя снаружи выглядел неизменным, и мне приходилось каждые три дня переделывать конфигурацию поиска, регулярки там использовались. Очень муторная хрень - когда тебе нужно работать, собирать инфу, а оно опять вдруг не работает, потому что админ продолжает там что-то менять.



Отредактировано py.user.next (Июнь 2, 2019 08:33:32)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version