Форум сайта python.su
0
Здравствуйте.
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)
Офлайн
857
Надо потом искать все row. Получить их и потом в цикле для каждого row искать в нём left и проверять название поля в тексте тега. Если название подходит, то надо в том же row искать right и брать его значение.
Я тебе так скажу: я такую фигню парсил и всё было нормально, пока на некоторых страницах не стали пропадать некоторые поля. Ну, например, нет телефона, так они не пустоту оставляли в поле телефона, а просто поле всё удаляли из выдачи. Так что если зафиксируешь скрипт на количество полей, то он может потом сломаться, когда какая-нибудь редкая страница окажется не такой, как все другие страницы.
И ещё, то, что ты спросил, относится к поиску сиблинга. Якобы тебе нужен сиблинг - это выглядит как решение. Но при парсинге HTML нужно избегать ориентировку по сиблингам, ориентировку по точным индексам. Там есть такая подлянка в HTML DOM - текстовые узлы в промежутках. Каждая пустота между узлами на самом деле является текстовым узлом, а у него есть свой индекс в списке узлов. И это всё ломает, когда ты хочешь просто по индексам узлы брать в документе.
Поэтому старайся искать по id и по class, потому что они от порядка не зависят. Так тебе меньше раз нужно будет подгонять свои скрипты обработки HTML, когда там на странице будет что-то меняться каждые три дня. У меня бывало такое, когда сайт менялся каждые три дня, хотя снаружи выглядел неизменным, и мне приходилось каждые три дня переделывать конфигурацию поиска, регулярки там использовались. Очень муторная хрень - когда тебе нужно работать, собирать инфу, а оно опять вдруг не работает, потому что админ продолжает там что-то менять.
Отредактировано py.user.next (Июнь 2, 2019 08:33:32)
Офлайн