Kак сделать мыло своими руками в домашних условиях для начинающих
16 февраля 2016 94889
Еще совсем недавно мыло ручной работы на прилавках магазинов считалось диковинкой. Высокая цена не останавливала, ведь все ингредиенты натуральны, плюс изделие не фабричное, а уникальное. Но то, что когда-то считалось роскошью, сегодня самостоятельно может сделать абсолютно любой человек. И это будет намного интереснее и полезнее. Подключите к процессу детей. Вместе можно разработать свой удивительный, ни на что не похожий рецепт домашнего мыла, а дальше передавать его из поколения в поколение. Предлагаем вам небольшое руководство о том, как сделать мыло ручной работы самостоятельно.
Мыло ручной работы в домашних условиях для начинающих: что нужно
Найти ингредиенты для мыла ручной работы совсем не сложно.
Мыльная основа. Простое детское мыло без запаха или смесь из специализированного магазина (может быть белой или прозрачной).
Базовое масло. Оливковое, абрикосовое, миндальное — на Ваш вкус.
Эфирное масло. Тут тоже выбор огромен: апельсиновое, иланг-иланг, чайного дерева и так далее. Выбирайте то, что подходит вашей коже. По возможности посоветуйтесь с косметологом.
Красители. Придать мылу ручной работы цвет можно с помощью специальных или пищевых красителей. Подойдут для этих целей и натуральные ингредиенты: какао, фруктовый сок, шоколад.
Емкости для водяной бани.Для тех, кто не знает. Водяная баня делается очень просто. Берете одну кастрюлю. Наливаете в нее немного воды. Ставите на огонь и помещаете в нее кастрюлю поменьше. Нагреваясь, вода будет мягко передавать тепло дну меньшей по размеру емкости, благодаря чему ингредиенты внутри расплавятся, но не подгорят.
Формочки для мыла. Кондитерские, детские, специальные — все, что подвернется вам под руку.
Спирт.
Пульверизатор.
Теплая жидкость. Отвар, молоко, простая вода для разбавления основы.
Как сделать мыло своими руками?
Это только кажется, что то, что предлагают крупные компании, невозможно создать самостоятельно. Мы расскажем вам, как сделать мыло своими руками в домашних условиях всего за 7 шагов.
Шаг 1. Разрежьте мыльную основу на мелкие кусочки. Детское мыло можете натереть на терке.
Шаг 2.На водяной бане растопите измельченное мыло или основу. Время от времени помешивайте плавящуюся смесь. Добавьте к ней базовое масло из расчета 3 чайных ложки на 100 г основы.
Шаг 3.По мере таяния основы периодически подливайте немного молока или сливок. Если получается сметанкообразная смесь, вы все делаете правильно. Неплохо будет добавить немного сахара. С ним основа быстрее расплавится. Молоко или сливки можно заменить небольшим количеством теплой воды или отвара трав. Но тут вы рискуете, так как эти ингредиенты могут привести к расслаиванию мыла ручной работы.
Шаг 4.Полностью растопленную основу снимите с огня. Добавьте примерно 5 капель эфирного масла, ложку глицерина, ароматизаторы, кофе, мед и все то, что вы подготовили для своего уникального творения.
Шаг 5.Аккуратно перелейте ваше варево в формочки. Поверхность мыла сбрызните спиртом из пульверизатора. Такая процедура поможет избежать образования пузырьков.
Шаг 6.Поставьте формочки в холодильник или в прохладное место.
Шаг 7.Примерно через пару дней застывшую массу можно будет достать из формочек и радоваться результату. Если готовите мыло в подарок, не забудьте красиво его оформить. Заверните сюрприз в пергаментную бумагу, перевяжите бечевкой или красивой ленточкой. Можете прикрепить палочку корицы, сушеный кружок апельсина или засушенный цветок.
Типичные ошибки мыловаров
Многие считают, что красного цвета мыла легко добиться с помощью свежих лепестков розы, ягод или вина. На самом деле эти ингредиенты с большой долей вероятности придадут грязно-серый оттенок. Для изготовления мыла красного цвета лучше использовать свекольный сок или розовую глину. В зависимости от количества таких добавок мыло ручной работы может приобрести целую гамму оттенков — от бледно-розового до ярко-бордового.
Для получения зеленого цвета не используйте зеленку или марганцовку. Они быстро выцветают. Лучше всего подойдут пищевые красители (например, для окрашивания пасхальных яиц), а также хна или сухая зелень.
Хороший желтый цвет самодельного мыла выйдет из ромашки, лепестков календулы или из куркумы.
Если хотите добавить большое количество сухих целебных трав, перемелите их и просейте через сито. Ведь большое количество крупных кусочков растений будет сильно царапать кожу.
Соблюдайте меру в использовании эфирных масел для изготовления мыла. Переборщите с масляной основой, и ваше мыло не будет хорошо мылиться, плюс ко всему еще и на ощупь будет казаться жирным и неприятным.
Рецепты мыла своими руками в домашних условиях
Домашнее мыло для лица: мыльная основа белого цвета, 2 столовых ложки ланолинового масла (или ланолина), 1 и 1/2 чайной ложки любого ароматного масла, 1 столовая ложка овсяных хлопьев, 1 столовая ложка молотого миндаля, высушенные и измельченные лепестки цветов, немного подсолнечного масла.
Мыло с сухими цветками лаванды: мыльная основа — 120 г, сухоцветы лаванды — около 1 чайной ложки без горки, 4-5 капель масла жожоба, 4-5 капель эфирного масла лаванды, 2-3 капли эфирного масла пачули, 1-2 капли синего красителя.
Украшение яиц на Пасху: оригинальные материалы и техники
Покраска яиц на Пасху
Интересные статьи
Подарок своими руками: как сделать мыло в домашних условиях | Подарки | Новый год
Не успели встретить Новый год — как надо готовить подарки на Рождество. И тут полезно вспомнить, что самый лучший подарок — сделанный своими руками. Но такой подарок должен быть не только приятным и красивым, но и полезным. А что может быть полезнее, чем мыло?
Когда человечество изобрело мыло, количество заболеваний, связанных с антисанитарией, пошло на убыль. Но наука и химическая промышленность не стоят на месте, и со временем мыло перестало быть полностью безопасным продуктом.
Философия мыла
Мыло — это химический продукт, смесь натриевых и калиевых солей жирных кислот. Изготавливается оно при помощи превращений самых разных кислот под воздействием гидроксидов. Грубо говоря, берётся обычное сало, к нему добавляется едкий натр, нагревается, и получается мыло.
Но не всякое мыло одинаково полезно. Так, мыло убирает с кожи всё без разбора, поэтому бактерицидными мылами постоянно мыться каждый день нельзя. Кроме этого, мыло может обезжирить тело.
Выбирая мыло в магазине, нужно внимательно изучать упаковку, чтобы знать, натуральное оно или синтетическое. Синтетические моют кожу слишком хорошо, смывают абсолютно весь слой сала.
Также важно избежать всех возможных реакций на мыло — кожных, аллергических. Аллергикам вообще рекомендуют мыться детским мылом. Если кожа жирная, можно пользоваться любым косметическим или туалетным мылом. А если на жирной коже есть прыщи, тогда лучше выбрать для мытья сульсеновое мыло.
Но самое полезное и лучшее мыло — сделанное своими руками, ведь вы точно знаете, из чего оно состоит. Кроме этого, изготовление мыла — увлекательный и творческий процесс, который даёт возможность получить продукт с теми свойствами, которые нужны именно вашей коже.
Самодельное мыло — это максимум натуральных компонентов и та отдушка, которая вам нравится.
Как стать мыловаром?
Вам потребуется:
Детское мыло или специальная мыльная основа, которую можно купить в специализированных магазинах товаров для рукоделия. Бывает прозрачная и матовая.
Форма для мыла.
Жирное масло (можно оливковое).
Ароматизатор.
Краситель.
Добавки по желанию.
Процесс:
1. Форма. Выберите форму для будущего мыла. Это может быть специальная пластиковая форма из магазина для рукоделия или то, что есть под рукой: детские формочки для песка, стаканчики из-под йогуртов или картонные коробки из-под молока, силиконовая форма для выпечки (наиболее удобна для новичков).
Фото: АиФ / Алёна Бацман
2. Мыльную основу или детское мыло нарезать кубиками и растопить на водяной бане или в микроволновой печи. Если вы пользуетесь микроволновой печью — будьте осторожны, основа нагревается очень быстро, а она не должна закипеть. Лучше находиться у печи и периодически помешивать основу.
Фото: АиФ / Алёна Бацман
3. Жирное масло. Наливаем 100 грамм мыльной основы в стакан и добавляем 1/3 чайной ложки жирного масла. Не переусердствуйте, потому что если масла будет слишком много, готовое мыло не будет пениться.
Фото: АиФ / Алёна Бацман
4. Цвет. Красители бывают сухие, жидкие, пигменты, перламутры. Кроме того, цвет мылу могут придать и натуральные ингредиенты. Например, шоколад придаст мылу коричневый цвет, а кофе — чёрный.
Сухие красители — очень концентрированные. Их нужно растворить в воде и только после этого пипеткой добавлять в мыло. Если добавите красителя слишком много, мыльная пена будет цветной.
Жидкие красители уже разбавлены, они очень удобны в использовании. Добавлять 1–10 капель на 100 г мыла. Можно смешивать их между собой, так что достаточно купить красители основных цветов — красный, жёлтый и синий.
Пигменты — это нерастворимые цветные порошки. Возьмите треть чайной ложки пигмента на 100 г мыльной основы, смешайте в чайной ложке с жирным маслом, чтобы не было комочков. Только после этого добавьте в основу. Если вы выбрали пигмент, используйте его на этапе добавления в мыло жирного масла, чтобы последнего в итоге не стало слишком много. Также учитывайте, что пигмент замутняет мыльную основу. Так что, если вы используете прозрачную основу, после добавления пигмента мыло всё равно станет матовым.
Перламутр — это блёстки, глиттеры. Они сделают мыло более праздничным и нарядным. Можно использовать вместе с любым из других видов красителей.
Фото: АиФ / Алёна Бацман
5. Аромат. Для приятного запаха в мыло можно добавить либо эфирное масло (3–7 капель на 100 г основы), либо ароматизаторы на водной основе (3–4 капли на 100 г). Не смешивайте между собой эфирные масла и ароматизаторы — запах получится в итоге неприятный. А вот разные эфирные масла в одном мыле, так же как и разные ароматизаторы, смешивать можно. Учитывайте и тот факт, что эфирные масла обладают дополнительными свойствами, например эфирное масло апельсина или имбиря бодрит, а эфирное масло лаванды — наоборот, успокаивает.
6. Косметические добавки. В мыло можно добавить дополнительные ингредиенты, чтобы обогатить его и придать ему дополнительные свойства или сделать мыло-скраб. Добавить в мыло можно:
шоколад или какао,
мёд,
сухое молоко,
овсяные хлопья,
кокосовую стружку,
косметическую глину,
кофе,
цедру апельсина или лимона.
Фото: АиФ / Алёна Бацман
7. Когда вы добавили в мыло всё необходимое, его нужно перелить в форму и остудить в холодильнике или на подоконнике. Вытаскивать мыло из формы можно, только когда оно полностью остынет. Силиконовая форма легко снимается, буквально выворачиваясь наизнанку, поэтому она оптимальна для новичков и для тех, кто экономит время. Пластиковая даёт больший простор фантазии, но мыло из неё вытаскивается тяжелее. Если мыло совсем не получается вытащить из формы — оставьте его на несколько дней, оно усохнет, и достать его будет легко.
Фото: АиФ / Алёна Бацман
Смотрите также:
Сладкие рецепты от простуды и гриппа: с бананом, орешками и даже шоколадом →
«ФУД-ШОУ»: как есть вкусно и не полнеть. Рецепты звезд →
Мыло своими руками — 95 фото приготовления домашнего душистого мыла
С каждым годом изготовление мыла в домашних условиях становится весьма популярным занятием. Причина интереса к такому производству вполне понятна: мыло, сделанное своими руками, является натуральным и безопасным средством гигиены.
Содержимое обзора:
Магазинное или изготовленное: какое мыло лучше?
Если обратить внимание на магазинные продукты, то в них обязательно будут присутствовать различные соединения и химические добавки, а также синтетические ароматизаторы.
Влияние такого состава на кожные покровы человека не всегда приносит положительный результат. Последствием применения магазинного мыла может стать появление зуда, стянутости или шелушения.
В ручном изготовлении используются натуральные ингредиенты. Такая косметическая продукция безопасна для людей, склонных к проявлению аллергических реакций, а также для детей.
К тому же, изготовленное вручную мыло (фото которого ниже), может выглядеть очень привлекательно и обладать любимым ароматом. Его можно презентовать в качестве эксклюзивного подарка или украсить ванную комнату необычным сувениром.
Мыло ручной работы доступно каждому
Конечно, можно и не утруждать себя изготовлением, а приобрести готовое уникальное мыло ручной работы у мастеров, которые давно занимаются данным производством.
Вот только цена такого эксклюзива не каждому может оказаться по карману – стоимость кусочка мыла довольно высокая.
Сделать мыло своими руками, как оригинальный подарок или для личного пользования, под силу каждому.
Преимуществами такого изготовления являются:
выбор формы кусочка;
любимый аромат;
индивидуальный подбор компонентов;
окраска по вкусу;
уникальный вид или узор.
В процессе производства мыла изготовитель может почувствовать себя настоящим творцом фантазий и проявить свою индивидуальность.
К тому же мыловарение настолько интересное занятие, что для многих оно становится не только интересным увлечением, но и способом дополнительного дохода.
Что понадобится для эксклюзива
Для того чтобы сделать мыло в домашних условиях, необходимо следующее:
Мыльная основа
При покупке стоит внимательно посмотреть: на основе чего она произведена. Лучшим вариантом будет натуральное пальмовое или кокосовое масло.
Также, в качестве основы может выступать обычное косметическое или детское мыло.
Но при их использовании, результат может быть непредсказуемым – возможно появление неприятного запаха (из-за наличия своего специфического аромата).
Различные добавки и наполнители
Предпочтение стоит отдавать не только своим вкусам, но и продумать разнообразие домашнего мыльного ассортимента.
Выбор стоит сделать в пользу масел, которые не обладают резким и мощным ароматом, например, масла персика, жожоба, миндаля, кокоса, оливы и авокадо.
Придать аромат можно с помощью эфирных масел. Прекрасно подойдут лимонное, лавандовое, апельсиновое и многие другие масла.
Наполнителем мыла могут служить цветочки лечебных растений, цедра лимона (для жирной кожи), молотые кофейные зерна или овсяные хлопья (для скраба). Обязательно присутствие глицерина. Этот наполнитель создаст эффект увлажнения и смягчения кожи.
Красители
Их используют для придания красивого оттенка. Ведь цветное мыло приятней глазу. Использовать можно как пищевые красители, так и натуральные.
Среди искусственных выделяют:
сухой порошок – более концентрированный, что позволяет экономично его расходовать;
жидкий краситель – более удобен в применении;
пигмент – водонерастворимый порошок разной расцветки, применение которого даст уникальные оттенки;
перламутр – используется вместе с красителями, придавая мылу оригинальность и изысканность.
Натуральные красители не менее интересны и красивы.
Получить голубой оттенок поможет эфирное масло ромашки, желтый – шафран, розовый – сок свеклы, черный – кофе, зеленый – водоросли спирулины, а коричневый цвет подарит шоколад.
Подручные инструменты
Формочки – от них зависит вид и размер мыла; две металлические емкости – создание эффекта водяной бани; терка – для измельчения мыльной основы.
Изготовление мыла ручной работы
Это интересное занятие не займет много времени, а мастер-класс по изготовлению мыла поможет наглядно просмотреть всю процедуру.
Занимаясь мыловарением, важно помнить, что данный процесс следует проводить в респираторе.
При изготовлении на основе готового косметического мыла, его следует натереть на терке и растопить. Для этого применяется водяная баня. Слишком нагревать не стоит, достаточно дождаться расплавления.
Максимальная температура подогрева не должна превышать 60 °С. Для определения лучше использовать термометр, предназначенный для жидкостей.
Привести основу в жидкое состояние можно и при помощи микроволновки. В этом случае, существует риск перегрева, поэтому необходимо проверять состояние основы каждые 15-20 секунд.
После получения нужной консистенции, в мыльную основу пора добавлять наполнители. Используя различные ингредиенты и эфирные масла важно помнить, что перебор – плохой помощник, и тщательно следить за количеством добавляемых веществ.
Следующий шаг – краситель. Его количество тоже нужно аккуратно отмерять. Лучше добавлять понемногу, постепенно отслеживая получившийся оттенок.
Осталось лишь разлить мыльную смесь в подготовленные формочки. Их необходимо смазать маслом (растительным) или вазелином. Это поможет более быстро извлечь мыло после застывания.
Мыло в бутылочке с дозатором
Самостоятельно можно изготовить не только брусочки, но и жидкое мыло для рук. Его приготовление отличается от основного лишь добавлением небольшого количества воды. Вливать ее нужно через 15 минут после приготовления, а потом хорошо взбить.
Останется разлить мыло по бутылочкам с дозатором и наслаждаться продуктом собственного изготовления.
Жидкое мыло ручной работы более удобно в использовании, к тому же его можно применять и как натуральный гель для душа.
Тайна изготовления мыла ручной работы раскрыта. Теперь каждому стало известно, как можно порадовать себя, близких и друзей натуральностью и необыкновенной красотой простого средства гигиены.
Фото мыла своими руками
Как сделать мыло своими руками.
Чтобы не заскучать и окончательно не впасть в зимнюю тоску, можно сварить мыло своими руками. Шоколадно-кофейное с корицей, медовое, ванильно-клубничное… по утрам так приятно просыпаться от любимого запаха. Создать мыло достаточно просто, нужно всего лишь подготовить все необходимые ингредиенты и смешать их в нужной пропорции.
Домашнее мыловарение на сегодняшний день — очень популярное хобби. Тысячи сайтов, блогов и форумов обсуждают рецепты, компоненты, ароматы и формы мыла, миллионы людей создают его в домашних условиях и получают уникальные, вкусно пахнущие кусочки в подарок.
Мыло ручной работы получается гораздо дешевле покупного мыла из магазинов «натуральной» косметики. Кроме того, вы сами придумаете дизайн и форму, добавите ароматы, которые любите. А это, согласитесь, немаловажно. Поэтому не сомневайтесь, дерзайте! И, возможно, домашнее мыловарение станет для вас чем-то большим, чем просто хобби.
Наш мастер-класс позволит вам на время окунуться в мир душистых ароматов и постичь основы мыловарения. Вы узнаете, как изготовить мыло своими руками и что для этого нужно.
Основное оборудование:
Микроволновая печь
Жаропрочные стеклянные колбы
Нож, ложки
Разделочная доска
Формы для заливки мыла.
Основные ингредиенты для создания мыла:
Прозрачная основа (используется для создания красивого эффекта прозрачности)
Матовая основа
Пищевой краситель
Ароматизаторы
Базовые масла (оливковое масло или масло жожоба)
Украшения (например — кофейные зерна, сухие цветы и растения, мелкие игрушки)
Распылитель со спиртом.
Несколько слов о мыльной основе. Это основной компонент, без которого ни один мыловар не сможет создать красивое мыло. Конечно, можно попробовать приготовить основу самостоятельно, но это намного сложнее, и требует много дополнительных ингредиентов. Мыльная основа бывает прозрачной и матовой. В состав второй входит диоксид титана, который и придает основе белый цвет. Прозрачная основа используется для приготовления мыла с разнообразными узорами, добавками, вкраплениями. Белая основа незаменима для создания слоеного мыла, для получения нежных оттенков в однотонном мыле.
Обращайте внимание на страну — производителя мыльной основы. На нашем мастер классе мы будем использовать английскую мыльную основу, которая считается эталоном качества. Она очень пластична, легко режется, хорошо вспенивается. Немецкая мыльная основа также славится среди мыловаров прежде всего тем, что позволяет получить мыло без воздушных пузырьков. Китайская мыльная основа все еще «плохо изученный зверь», но она зарекомендовала себя не с лучшей стороны. Российская мыльная основа имеет посторонние запахи, что также нежелательно при изготовлении мыла.
Делаем мыло своими руками
Итак, приступим.
Подготовим формы для заливки. Вместо них можно использовать различные пластиковые тарелочки, стаканчики, контейнеры. В несколько форм предварительно помещаем кусочки люфы.
Одну из форм заполняем заготовками из матовой мыльной основы. Для этого отрезаем от основы тонкие пластинки и скатываем их в рулоны.
В пустые формы можно положить зерна кофе, сухоцветы, семена, веточки — все, что душе угодно.
Нарезаем прозрачную основу кубиками, помещаем в стеклянную колбу. Ставим в микроволновку и нагреваем. Здесь основное правило — не допустить закипания.
Обязательно используйте специальною основу и не пытайтесь растопить детское мыло — это чревато нежелательными последствиями.
В жидкую основу добавляем краситель — 10-15 капель, отдушку (у нас это оранжевый краситель и ароматизатор «бабл-гам») и оливковое масло.
Красителями также не стоит злоупотреблять, иначе мыльная пена будет окрашиваться.
Осторожно перемешиваем содержимое колбы и разливаем по формам, заполняя их до половины.
Форму с белыми рулончиками заполняем доверху. Заливать необходимо тонкой струйкой, но достаточно быстро.
Также наливаем немного разогретой основы на плоскую крышку, например, от пластикового контейнера — полученную таким образом пластину можно будет использовать в качестве украшения.
Если разогретое мыло осталось — его можно перетопить еще раз, при этом оно не потеряет своих свойств.
После того как содержимое формочек затвердеет, сбрызгиваем заготовки спиртом и делаем ножом сетку, чтобы следующий слой прилегал как можно плотнее.
На формах с люфой сетку можно не делать. Заготовку с рулончиками извлекаем из формы — это мыло уже готово.
Из застывшей плоской пластины делаем завиточки и рулончики для украшения.
Далее растпаливаем матовую основу. Стоит иметь в виду, что она плавится дольше, чем прозрачная.
Заливаем формы. Если вы хотите получить трехслойное мыло — оставляем место для следующего слоя, если двухслойное — заливаем формы доверху.
Интересного эффекта можно достичь, используя технику «мрамирования». Для этого половину разогретой основы смешиваем с красителем (у нас он изумрудный).
Зальём в пустую форму одновременно белую и изумрудную основы.
Полностью залитые формы украшаем сверху подготовленными завиточками.
Снова расплавляем прозрачную основу и окрашиваем ее, не забывая добавлять масло и ароматизатор.
Заливаем оставшиеся формы до верху. Через 30 — 40 минут ваше мыло можно доставать из силиконовой формы (если у вас пластиковая форма, нужно будет подождать 1-2 часа).
Как видите — ничего сложного. Постичь основы мыловарения может абсолютно каждый. Имрповизируйте с цветами, слоями, формами, добиваясь неожиданных и интересных эффектов. Согласитесь, очень приятно пользоваться мылом, сваренным своими руками по собственному рецепту. А дарить его приятнее вдвойне!
Как сделать мыло в домашних условиях, 3 лучших рецепта
Основные преимущества мыла ручной работы заключается в том, что оно полезное и уникальное. Мыловарение – это приятный творческий процесс. В этой статье мы рассмотрим: как сделать мыло своими руками в домашних условиях.
Содержание
1 Лавандово-цитрусовое мыло
1.1 Мастер-класс
2 Шоколадное мыло ручной работы
2.1 Мастер-класс
3 Разноцветное мыло
3.1 Мастер-класс
4 Как украсить мыло ручной работы?
Лавандово-цитрусовое мыло
Преимущества данного мыла: обладает антибактериальными и скрабирующими свойствами, идеально подходит для жирной и проблемной кожи, имеет приятный аромат.
Порежьте квадратик шоколада и добавьте в растопленную основу, затем снимите с плиты.
Добавьте базовое масло.
Добавьте отдушку и слегка помешайте.
Сбрызните формочку спиртом и залейте смесь.
Сбрызните поверхность мыла спиртом.
Оставьте мыло на сутки для полного застывания.
Шоколадное мыло ручной работы готово! Рекомендую к просмотру данное видео!
DIY: Мыло ШОКОЛАДНЫЙ ТОРТ с орешками ● Soap making ● Мыльные сладости
Watch this video on YouTube
Разноцветное мыло
Преимущества данного мыла: хорошо очищает кожу, яркие цвета повышают настроение, выглядит необычно и отлично подойдет в качестве позитивного подарка.
Вам понадобится: мыльная основа, силиконовые формочки, распылитель со спиртом, пищевые красители, доска и нож, ароматизатор, посуда для смеси.
Мастер-класс
Порежьте мыльную основу на кубики.
Растопите её.
Отлейте 1/3 часть основы, добавьте ароматизатор и фиолетовый краситель.
Сделайте формочке наклон и вылейте смесь.
Сбрызните фиолетовый слой спиртом и дождитесь, пока он немного застынет.
Разделите мыльную основу пополам и в одну часть добавьте ароматизатор и жёлтый краситель.
Залейте жёлтую смесь в формочку с другой стороны.
Сбрызните жёлтый слой спиртом и дождитесь, пока он немного застынет.
Добавьте ароматизатор и бирюзовый краситель в мыльную основу.
Залейте бирюзовую смесь в формочки и сбрызните спиртом.
Оставьте мыло на 2 дня для полного застывания.
Разноцветное мыло ручной работы готово! Рекомендую к просмотру данное видео!
Мыльная Вобла 🐟 Мыло ручной работы в форме рыбы 🐟 Мыловарение для новичков
Watch this video on YouTube
Как украсить мыло ручной работы?
Красота мыла зависит от его формы и цвета. Для яркого и насыщеного цвета используйте пищевые красители.Самый популярный способ украшения — это использование серебристой или золотистой мики (блёстки, глитеры). Достаточно просто украсить микой верхушку мыла, и даже самое обычное белое мыло станет торжественным. Золотистая либо серебристая мика прекрасно сочетается со всеми цветами. Однако помните, что гармонично смотрятся не более 2-3 цветовые гаммы вместе. Перед началом мыловарения хорошо продумайте дизайн мыла – цвет, форму, размер, аромат. Запах мыла напрямую зависит от эфирных масел и отдушек. Украшайте мыло надписями, создавайте рисунки и самое главное оформите мыло в красивую упаковку. Ещё одно преимущество мыла ручной работы — его можно создать совсем не похожим на обычное мыло например: в форме тортика, обуви, зверушки…Просмотрите фото-галерею идей и создайте шикарное мыло ручной работы!
Как сделать мыло в домашних условиях
Мыловарение- очень модное, интересное и полезное хобби!
В домашних условиях Вы легко сможете создать очень красивые мыла ручной работы.
Итак, начнем повествование о компонентах для мыловарения, познакомимся поближе =)
1. Мыльная основа
Мыльная основа— уже готовый к употреблению продукт, но не имеющий ни цвета, ни запаха, ни формы. Брусок мыла, так скажем..
Основа для мыла бывает нескольких видов:
1) Твердая мыльная основа. Делится на несколько подвидов =))) Белая (матовая) и прозрачная (глицириновая). Состав один и тот же, только из белой основы получается матовое мыло с пастэльными оттенками различных цветов, если Вы добавите красители. И прозрачная, в которой видны глиттеры (блестки), перламутр (мики) или, например, сухоцветы.
2) Кремообразная мыльная основа. По консистенции крема, но мыльная основа. Из такого вида основы здорово делать различные скрабы для тела, маски для волос и лица, пенки для умывания.
3) Жидкая мыльная основа. Такая основа поможет Вам сделать шампунь для волос, гель для душа или пену для ванны. В жидкой мыльной основе, особенно, если она именно для создания шампуня, очень много в составе полезных компонентов для волос!
2. Красители для мыла. Пищевые и косметические
Конечно же, интереснее и красивее, когда мыло у нас цветное! На помощь приходят красители, которые так же подразделяются:
1) Пищевые красители. Данный вид красителей используется в пищевой и кондитерской промышленности. Цвета в мыле получаются красивыми. Но единственный минус пищевых красителе- они мигрируют. Что же это такое? Допустим Вы решили создать многоцветное мыло. Каждый слой залили разными цветами. Мыло застыло- красота! Через неделю-две (если Вы мыло не подарили) Вы начинаете видеть, что границы цветов начинают смешиваться, и один цвет так и норовит залезть на другой. Зачастую, когда делается многослойное мыло, как раз такой эффект нежелателен. Пищевые красители идеально подойдут для создания однотонного мыла или же многослойного, но в дальнейшем с эффектом «акварели» =)
2) Косметические красители (пигменты). Такие красители используются в косметической промышленности. Их цвета очень красивые, яркие, стойкие. И Самое важное, что со временем цвета не мигрируют!!!
3) Косметические перламутровые пигменты (мики). Изумительно красивые перламутровые порошочки разных цветов. Мики использовать можно только в прозрачной основе, т.к. в белой их не будет видно
4) Глиттеры (блестки). Если Вы хотите создать праздничное мыло или подчеркнуть «изюминку», то они Вам обязательно понадобятся.
3. Ароматизаторы (отдушки) косметические
Великолепное разнообразие для создания Вашего неповторимого ароматного мыла. Ароматизаторы синтетические, не несут в себе никакой пользы, кроме потрясающе вкусных ароматов.
4. Эфирные масла
Эфирные масла используются в мыле в качестве натурального и полезного ароматического масла. По мимо своих ароматных функций, такое масло имеет и полезные действия расслабляет или наоборот выводит из унылого состояния. С эфирными маслами прекрасно делать спа-мыло.Но перед употреблением его в мыло, обязательно прочитайте информацию про данное эфирное масло!
Смешивать в одном мыле Ароматизатор и Эфирное масло НЕЛЬЗЯ!
5. Косметические жидкие и твердые масла
Мыльная основа в составе уже имеет и глицерин и различные другие косметические масла и увлажнители. Но, чтобы мыло у Вас было более питательным и увлажняющим, нужно добавить в него косметическое масло, например, миндальных косточек или авокадо.
6. Форма для мыла. Пластик, силикон и супер-силикон
Форма для мыла это самая важная составляющая для Вашего будущего мыла. Ведь можно обойтись без красителя и масла, а без формы никуда!
Можно пользоваться абсолютно разными подручными формами, например, пустой стаканчик от йогурта, или отрезать часть бутылки, пластиковая емкость от конфет или печенья.
Никогда не заливайте мыльную основу в стеклянные и металлические формы! Мыло оттуда не достать!
Вариантов форм для мыла масса, но давайте обратимся именно к формам для мыла!
1) Пластиковые формы имеют различные красивые дизайны и изготавливаются из прочного пластика. Такие формы, конечно же, многоразовые! Работать с пластиковыми формами нужно аккуратно и бережна, впрочем как и со всеми ингредиентами. В пластиковой форме мыло чуть дольше застывает, парой его бывает сложно достать, но это на первый взгляд. Дайте Вашему мылу как следует просохнуть.
После полного застывания мыла в пластиковой форме, положите ее в морозилку на 5 минут. Достаньте оттуда, и аккуратно надавите на бока формы- мыло легко отделится.
2) Кондитерские силиконовые формы тоже доступны в продаже, и наверняка, почти у каждой хозяйки найдутся силиконовые формы для выпечки кексов. Такие формы очень удобны и просты в использовании
3) Супер-силиконовые формы для мыла. Этот вид форм пожалуй самый красивый и необычный. Такие толстые силиконовые формы передадут Вашему мылу наитончайшие подробности изображения. Из супер-силиконовых форм очень красиво получается объемное мыло, его здорово дарить и использовать как сувенир, т.к. мылить такую красоту ну уж очень жалко =))))
7. Что еще можно добавить в мыло?! Мыло-скраб, мыло-маска =)
Мыло может быть как просто ароматным мыльным кусочком или же сочетать в себе скрабящие компоненты. В мыло очень часто вплавляют люфу (натуральное сушеное волокно тыквы),ее используют как мочалку и получается 2 в 1. Еще для создания мыла-скраба можно добавить гранулы для скраба, кофейную гущу, соль или сахар. А мыло-маска делается легко! Добавьте в мыльную основу косметическую глину под Ваш тип кожи, и наслаждайтесь эффектом.
8. Декор мыла и упаковка
В мыло для красоты можно вплавлять сухоцветы ( только в прозрачную мыльную основу), получится аля прованс. Для создания оригинального мыла Вы можете воспользоваться водорастворимой бумагой и напечатать на ней какой угодно рисунок, текст поздравления, стих или фотографию любимых. Водорастворимая бумага уникальна, когда мыльный слой стирается до нее, она с прикосновением воды просто исчезает, никаких бумажных комочков!
В мыло можно вплавлять маленькие кусочки различных мыл, например, фруктиков, конфеток.
Декупаж на однотонном мыле смотрится так же восхитительно!
Упаковать мыло это целое искусство, конечно, можно ограничиться простыми прозрачными пакетиками и завязать ленточки, а можно и красиво обернуть в крафт бумагу или бумагу тишью, наклеить наклейку Ручная работа, создать бирку-тэг с описанием или составом мыла!
А теперь перейдем к самому главному – созданию мыла ручной работы!
В мыльную основу на 100 грамм можно добавить:
3-7 капель эфирного масла или 5-7 капель отдушки (добавляется в последнюю очередь и в остывшую основу)
( не смешивать с эфирными маслами *) и не добавлять в горячую основу.
0,5-1 чайную ложку жирного ( базового) масла (по желанию)
1-7 капель жидкого красителя
1/6 чайной ложки пигмента (разводится в спирте, либо в базовом масле)
1-2 кристаллика ментола ( для придания «холодка» мылу)
кусочек люфы ( в качестве скраба)
Эфирные масла нельзя смешивать с отдушками, т.к. эфирные масла имеют свойства «втягивать» в себя.
Нарежьте кусок мыльной основы на кубики размером 2*2 см, поместите в термо-емкость и поставьте плавиться на водяную баню или в микроволновку. В микроволновке поставьте среднюю или минимальную мощность. Мыльную основу нельзя доводить до кипения, иначе PH изменится и она потеряет все полезные свойства масел и других активных компонентов. После того как мыльная основа стала жидкой, добавьте в нее краситель/пигмент/глиттер/перламутр и перемешайте. Далее отмерьте 1 чайную ложку косметического масла и тоже добавьте в жидкую мыльную основу. Слишком часто и быстро не перемешивайте, потому что основа начнет остывать и появятся пузырики, а нам этого не нужно. После того как основные компоненты добавлены, осталось придать волшебный аромат мылу. Капаем в него ароматизатор или эфирное масло порядка 5-15 капель. Сбрызгиваем форму спиртосодержащим раствором для того чтобы наше мыло затекло во все уголки формы. Заливаем в форму наше мыло и поверхность так же сбрызгивает спиртосодержащим раствором, чтобы убрать с поверхности все пузырики.
Кстати, если Вы делаете многослойное мыло, то каждый слой нужно поцарапать и сбрызнуть спиртосодержащим раствором для хорошего сцепления слоев!
Оставляем наше мыло остывать минут 30-40, после чего, аккуратно извлеките мыло из формы! Можно уже идти им пользоваться! =)
Если Вы не знаете, что нужно приобрести для мыловарения, то можете воспользоваться набором «МЫЛОВАР XXL»
Парсинг веб-страниц с помощью Python с использованием Beautiful Soup – Dataquest
30 марта 2021 г.
Узнайте, как парсить веб-страницы с помощью Python!
Интернет — это абсолютно огромный источник данных — данных, к которым мы можем получить доступ с помощью парсинга и Python!
На самом деле веб-скрапинг часто является единственным способом доступа к данным. Существует много информации, которая недоступна в удобном экспорте CSV или простых в подключении API. И сами веб-сайты часто являются ценными источниками данных — подумайте, например, о том, какой анализ вы могли бы провести, если бы могли загружать каждое сообщение на веб-форуме.
Чтобы получить доступ к такого рода наборам данных на странице, нам придется использовать веб-скрапинг.
Не волнуйтесь, если вы еще новичок!
В этом руководстве мы расскажем, как выполнять веб-скрапинг с помощью Python с нуля, начиная с некоторых ответов на часто задаваемые вопросы.
Затем, , мы будем работать над настоящим проектом по очистке веб-страниц, сосредоточившись на данных о погоде.
Мы будем работать вместе, чтобы собирать данные о погоде из Интернета для поддержки приложения погоды.
Но прежде чем мы начнем писать Python, мы должны изучить основы! Если вы уже знакомы с концепцией парсинга веб-страниц, не стесняйтесь прокрутить эти вопросы и сразу перейти к руководству!
Основы парсинга веб-страниц:
Что такое парсинг веб-страниц в Python?
Некоторые веб-сайты предлагают наборы данных, которые можно загрузить в формате CSV или получить к ним доступ через интерфейс прикладного программирования (API). Но многие веб-сайты с полезными данными не предлагают этих удобных опций.
Рассмотрим, например, веб-сайт Национальной метеорологической службы. Он содержит актуальные прогнозы погоды для каждого места в США, но эти данные о погоде недоступны в формате CSV или через API. Это должно быть просмотрено на сайте NWS:
Если бы мы захотели проанализировать эти данные или загрузить их для использования в каком-то другом приложении, мы бы не стали кропотливо все копировать и вставлять. Веб-скрапинг — это метод, который позволяет нам использовать программирование для выполнения тяжелой работы. Мы напишем код, который просматривает сайт NWS, берет только те данные, с которыми мы хотим работать, и выводит их в нужном нам формате.
В этом руководстве мы покажем вам, как выполнять парсинг веб-страниц с помощью Python 3 и библиотеки Beautiful Soup. Мы будем собирать прогнозы погоды из Национальной метеорологической службы, а затем анализировать их с помощью библиотеки Pandas.
Но для ясности: для парсинга в Интернете можно использовать множество языков программирования! Например, мы также обучаем парсингу веб-страниц в R. Однако в этом уроке мы будем придерживаться Python.
Как работает парсинг веб-страниц?
Когда мы очищаем веб-страницы, мы пишем код, который отправляет запрос на сервер, на котором размещена указанная нами страница. Сервер вернет исходный код — в основном HTML — для запрошенной нами страницы (или страниц).
До сих пор мы, по сути, делаем то же самое, что и веб-браузер — отправляем запрос к серверу с определенным URL-адресом и просим сервер вернуть код для этой страницы.
Но в отличие от веб-браузера, наш код парсинга веб-страниц не интерпретирует исходный код страницы и не отображает страницу визуально. Вместо этого мы напишем некоторый собственный код, который фильтрует исходный код страницы в поисках определенных элементов, которые мы указали, и извлекает любой контент, который мы дали указание извлечь.
Например, если бы мы хотели получить все данные из таблицы, отображаемой на веб-странице, наш код должен был бы последовательно выполнять следующие шаги:
Запросить содержимое (исходный код) определенного URL-адреса с сервера
Загрузите возвращаемый контент
Определите элементы страницы, которые являются частью таблицы, которую мы хотим
Извлеките и (при необходимости) переформатируйте эти элементы в набор данных, который мы можем анализировать или использовать любым способом, который нам нужен.
Если все это звучит очень сложно, не волнуйтесь! Python и Beautiful Soup имеют встроенные функции, разработанные для того, чтобы сделать это относительно простым.
Важно отметить одну вещь: с точки зрения сервера, запрос страницы через веб-скрапинг аналогичен загрузке ее в веб-браузере. Когда мы используем код для отправки этих запросов, мы можем «загружать» страницы намного быстрее, чем обычный пользователь, и, таким образом, быстро потреблять ресурсы сервера владельца веб-сайта.
Зачем использовать Python для парсинга веб-страниц?
Как упоминалось ранее, парсинг веб-страниц возможен на многих языках программирования.
Однако одним из самых популярных подходов является использование Python и библиотеки Beautiful Soup, что мы и будем делать в этом руководстве.
Чтобы научиться делать это с помощью Python, будет доступно множество учебных пособий, обучающих видеороликов и фрагментов кода, которые помогут вам углубить свои знания после того, как вы освоите основы Beautiful Soup.
Законен ли парсинг веб-страниц?
К сожалению, здесь нет однозначного ответа. Некоторые веб-сайты явно разрешают веб-скрапинг. Другие явно запрещают это. Многие веб-сайты не предлагают каких-либо четких указаний так или иначе.
Перед парсингом любого веб-сайта мы должны найти страницу условий и положений, чтобы узнать, существуют ли явные правила парсинга. Если они есть, мы должны им следовать. Если их нет, то это становится скорее призывом к суждению.
Помните, однако, что веб-скрапинг потребляет ресурсы сервера для хост-сайта. Если мы просто очищаем одну страницу один раз, это не вызовет проблем. Но если наш код очищает 1000 страниц каждые десять минут, это может быстро дорого обойтись владельцу веб-сайта.
Таким образом, в дополнение к соблюдению любых явных правил веб-скрапинга, размещенных на сайте, также рекомендуется следовать следующим рекомендациям:
Передовой опыт веб-скрейпинга:
Никогда не соскребайте чаще, чем нужно.
Рассмотрите возможность кэширования содержимого, которое вы очищаете, чтобы оно загружалось только один раз.
Встройте паузы в свой код, используя такие функции, как time.sleep() , чтобы не перегружать серверы слишком большим количеством запросов слишком быстро.
В нашем случае для этого руководства данные NWS являются общественным достоянием, и его условия не запрещают веб-скрапинг, поэтому мы готовы продолжить.
Изучайте Python правильно.
Изучите Python, написав код Python с первого дня прямо в окне браузера. Это лучший способ выучить Python — убедитесь сами в одном из наших 60+ бесплатных уроков.
Попробуйте Dataquest
Компоненты веб-страницы
Прежде чем мы начнем писать код, нам нужно немного понять структуру веб-страницы. Мы будем использовать структуру сайта для написания кода, который доставит нам данные, которые мы хотим очистить, поэтому понимание этой структуры является важным первым шагом для любого проекта по очистке веб-страниц. Когда мы посещаем веб-страницу, наш веб-браузер отправляет запрос на веб-сервер. Этот запрос называется запросом GET , так как мы получаем файлы с сервера. Затем сервер отправляет обратно файлы, которые сообщают нашему браузеру, как отображать страницу для нас. Эти файлы обычно включают:
HTML — основной контент страницы.
CSS — используется для добавления стилей, чтобы страница выглядела лучше.
Изображения — форматы изображений, такие как JPG и PNG, позволяют отображать изображения на веб-страницах.
После того, как наш браузер получит все файлы, он отобразит страницу и покажет ее нам.
Много чего происходит за кулисами для красивого рендеринга страницы, но нам не нужно беспокоиться о большей части этого, когда мы сканируем веб-страницы. Когда мы выполняем веб-скрапинг, нас интересует основной контент веб-страницы, поэтому мы смотрим в первую очередь на HTML.
HTML
Язык разметки гипертекста (HTML) — это язык, на котором создаются веб-страницы. Однако HTML — это не язык программирования, как Python. Это язык разметки , который сообщает браузеру, как отображать контент.
HTML имеет множество функций, похожих на те, которые вы можете найти в текстовом процессоре, таком как Microsoft Word, — он может выделять текст жирным шрифтом, создавать абзацы и т. д.
Если вы уже знакомы с HTML, смело переходите к следующему разделу этого руководства. В противном случае давайте совершим краткий обзор HTML, чтобы мы знали достаточно, чтобы эффективно парсить.
HTML состоит из элементов, называемых тегами . Самый простой тег — это тег . Этот тег сообщает веб-браузеру, что все, что находится внутри него, представляет собой HTML. Мы можем создать простой HTML-документ, используя этот тег:
.
Мы еще не добавили никакого контента на нашу страницу, поэтому, если бы мы просмотрели наш HTML-документ в веб-браузере, мы бы ничего не увидели:
Прямо внутри тега html мы можем поместить два других тега: головка бирка и бирка тела.
Основное содержимое веб-страницы помещается в тег body . Тег head содержит данные о заголовке страницы и другую информацию, которая обычно бесполезна при парсинге:
<голова>
голова>
<тело>
тело>
Мы до сих пор не добавили на нашу страницу никакого контента (который входит в тело ), поэтому, если мы откроем этот HTML-файл в браузере, мы все равно ничего не увидим:
Возможно, вы заметили выше, что мы поместили теги head и body внутрь тега html . В HTML теги являются вложенными и могут находиться внутри других тегов.
Теперь мы добавим наш первый контент на страницу внутри тега p . Тег p определяет абзац, и любой текст внутри тега отображается как отдельный абзац:
<голова>
голова>
<тело>
<р>
Вот абзац текста!
<р>
Вот второй абзац текста!
тело>
При отображении в браузере этот HTML-файл будет выглядеть так:
Вот абзац текста!
Вот второй абзац текста!
Теги имеют часто используемые имена, которые зависят от их положения по отношению к другим тегам:
дочерний — дочерний тег является тегом внутри другого тега. Таким образом, два приведенных выше тега p являются дочерними элементами тега body .
parent — родительский тег — это тег, внутри которого находится другой тег. Выше, 9Тег 0107 html является родителем тега body .
одноуровневый элемент — одноуровневый элемент представляет собой тег, вложенный в того же родителя, что и другой тег. Например, head и body являются братьями и сестрами, так как они оба находятся внутри html . Обе метки p являются родственными, так как они обе находятся внутри корпуса .
Мы также можем добавлять свойства к тегам HTML, которые изменяют их поведение. Ниже мы добавим дополнительный текст и гиперссылки, используя 9Тег 0107 и .
<голова>
голова>
<тело>
<р>
Вот абзац текста!
Изучайте науку о данных онлайн
<р>
Вот второй абзац текста!
python.org">Питон
Вот как это будет выглядеть:
Вот абзац текста! Изучайте науку о данных онлайн
Вот второй абзац текста! Питон
В приведенном выше примере мы добавили два тега и . Теги и являются ссылками и говорят браузеру отображать ссылку на другую веб-страницу. Свойство тега href определяет, куда ведет ссылка.
a и p — чрезвычайно распространенные HTML-теги. Вот еще несколько:
div — указывает на раздел или область страницы.
б — любой текст внутри выделяется жирным шрифтом.
i — любой текст внутри выделяется курсивом.
таблица — создает таблицу.
форма — создает форму ввода.
Полный список тегов см. здесь.
Прежде чем мы перейдем к фактическому веб-скрейпингу, давайте узнаем о свойствах class и id . Эти специальные свойства дают имена HTML-элементам и упрощают взаимодействие с ними при очистке.
Один элемент может иметь несколько классов, и класс может быть общим для элементов. Каждый элемент может иметь только один идентификатор, а идентификатор можно использовать только один раз на странице. Классы и идентификаторы необязательны, и не все элементы будут иметь их.
Мы можем добавить классы и идентификаторы в наш пример:
Как видите, добавление классов и идентификаторов вообще не меняет способ отображения тегов.
Библиотека запросов
Теперь, когда мы понимаем структуру веб-страницы, пришло время перейти к самой интересной части: очистке содержимого, которое нам нужно! Первое, что нам нужно сделать, чтобы очистить веб-страницу, — это загрузить страницу. Мы можем загружать страницы, используя библиотеку запросов Python.
Библиотека запросов сделает запрос GET к веб-серверу, который загрузит для нас HTML-содержимое данной веб-страницы. Существует несколько различных типов запросов, которые мы можем сделать, используя запросы , из которых GET — только один. Если вы хотите узнать больше, ознакомьтесь с нашим руководством по API.
Давайте попробуем загрузить простой образец веб-сайта, https://dataquestio.github.io/web-scraping-pages/simple.html .
Нам нужно сначала импортировать запрашивает библиотеку , а затем загружает страницу с помощью метода request.get:
запросов на импорт
страница = запросы.получить("https://dataquestio.github.io/web-scraping-pages/simple.html")
страница
<Ответ [200]>
После запуска нашего запроса мы получаем объект Response. Этот объект имеет свойство status_code , которое указывает, была ли страница успешно загружена:
page. status_code
200
A код_состояния из 200 означает, что страница успешно загружена. Мы не будем полностью погружаться в коды состояния здесь, но код состояния, начинающийся с 2 , обычно указывает на успех, а код, начинающийся с 4 или 5 , указывает на ошибку.
Мы можем распечатать HTML-контент страницы, используя свойство content :
стр.контент
<голова>
Простой пример страницы
голова>
<тело>
Вот простой контент для этой страницы.
тело>
Разбор страницы с помощью BeautifulSoup
Как вы можете видеть выше, мы загрузили HTML-документ.
Мы можем использовать библиотеку BeautifulSoup для разбора этого документа и извлечения текста из тега p .
Сначала нам нужно импортировать библиотеку и создать экземпляр класса BeautifulSoup для анализа нашего документа:
из импорта bs4 BeautifulSoup
суп = BeautifulSoup(page. content, 'html.parser')
Теперь мы можем распечатать HTML-содержимое страницы, красиво отформатированное, используя метод prettify для объекта BeautifulSoup .
печать (суп.красивость())
<голова>
Простой пример страницы
голова>
<тело>
Вот простой контент для этой страницы.
тело>
Этот шаг не является строго обязательным, и мы не всегда будем с ним связываться, но может быть полезно взглянуть на преттифицированный HTML, чтобы было легче увидеть структуру тегов и места их вложения. Поскольку все теги вложены друг в друга, мы можем перемещаться по структуре по одному уровню за раз. Мы можем сначала выбрать все элементы на верхнем уровне страницы, используя свойство children супа .
Обратите внимание, что дочерние элементы возвращают генератор списка, поэтому нам нужно вызвать для него функцию списка :
список(суп. детский)
['html', 'n', Простой пример страницы
Вот некоторый простой контент для этой страницы.
]
Приведенное выше говорит нам о том, что на верхнем уровне страницы есть два тега — начальный тег и тег . В списке также есть символ новой строки ( n ). Давайте посмотрим, каков тип каждого элемента в списке:
Как мы видим, все предметы BeautifulSoup объектов:
Первым является объект Doctype , который содержит информацию о типе документа.
Второй — это NavigableString , представляющий текст, найденный в HTML-документе.
Конечным элементом является объект Tag , который содержит другие вложенные теги.
Наиболее важным типом объектов, с которым мы будем иметь дело чаще всего, является объект Tag .
Тег позволяет нам перемещаться по HTML-документу и извлекать другие теги и текст. Вы можете узнать больше о различных объектах BeautifulSoup здесь.
Теперь мы можем выбрать тег html и его дочерние элементы, взяв третий элемент в списке:
html = список(суп.дети)[2]
Каждый элемент в списке, возвращаемом свойством children , также является объектом BeautifulSoup , поэтому мы также можем вызвать children 9Метод 0108 на html .
Теперь мы можем найти детей внутри тега html :
список(html.дети)
['n', Простой пример страницы , 'n',
Вот некоторый простой контент для этой страницы.
тело>, 'н']
Как мы видим выше, здесь есть два тега: head и body . Мы хотим извлечь текст внутри тега p , поэтому углубимся в тело:
тело = список (html.children) [3]
Теперь мы можем получить тег p , найдя потомков тега body:
список(тело.дети)
['n',
Вот простой контент для этой страницы.
, 'n']
Теперь мы можем изолировать тег p:
p = список(тело.дети)[1]
Как только мы изолировали тег, мы можем использовать метод get_text для извлечения всего текста внутри тега:
p.get_text()
'Вот простое содержание этой страницы.'
Одновременный поиск всех экземпляров тега
То, что мы сделали выше, было полезно для выяснения того, как перемещаться по странице, но потребовалось много команд, чтобы сделать что-то довольно простое.
Если мы хотим извлечь один тег, мы можем вместо этого использовать метод find_all , который найдет все экземпляры тега на странице.
Обратите внимание, что find_all возвращает список, поэтому нам придется выполнить цикл или использовать индексирование списка для извлечения текста:
суп.find_all('p')[0].get_text()
'Вот простое содержание этой страницы.'
Если вместо этого вы хотите найти только первый экземпляр тега, вы можете использовать метод find , который вернет один объект BeautifulSoup :
суп.найти('р')
Вот простой контент для этой страницы.
Поиск тегов по классу и идентификатору
Ранее мы ввели классы и идентификаторы, но, вероятно, было непонятно, зачем они нужны.
Классы и идентификаторы используются CSS для определения, к каким элементам HTML следует применять определенные стили. Но когда мы очищаем, мы также можем использовать их, чтобы указать элементы, которые мы хотим очистить.
Чтобы проиллюстрировать этот принцип, мы будем работать со следующей страницей:
<голова>
Простой пример страницы
голова>
<тело>
<дел>
<р>
Первый параграф.
<р>
Второй абзац.
<р>
Первый внешний абзац.
<р>
Второй внешний абзац.
тело>
Мы можем получить доступ к вышеуказанному документу по URL-адресу https://dataquestio.github.io/web-scraping-pages/ids_and_classes.html .
Давайте сначала загрузим страницу и создадим объект BeautifulSoup :
<голова>
Простой пример страницы
название>
голова>
<тело>
<дел>
<р>
Первый параграф.
Второй абзац.
Первый внешний абзац.
Второй внешний абзац.
тело>
Теперь мы можем использовать метод find_all для поиска элементов по классу или идентификатору. В приведенном ниже примере мы будем искать любой тег p , который имеет внешний текст класса :
.
суп.find_all('p', class_='внешний текст')
[
Первый внешний абзац.
,
Второй внешний абзац.
]
В приведенном ниже примере мы будем искать любой тег, имеющий класс external-text 9.0108 :
суп.найти_все(класс_="внешний-текст")
<р>
Первый внешний абзац.
,
Второй внешний абзац.
]
Мы также можем искать элементы по id:
суп. find_all(id="первый")
[
Первый параграф.
]
Использование селекторов CSS
Мы также можем искать элементы с помощью селекторов CSS. Эти селекторы — это то, как язык CSS позволяет разработчикам указывать теги HTML для стиля. Вот несколько примеров:
p a — находит все теги a внутри тега p .
body p a — находит все теги a внутри тега p внутри тега body .
html body — находит все теги body внутри тега html .
p.outer-text — находит все теги p с классом external-text .
p#first — находит все p теги с идентификатором сначала .
body p.outer-text — находит любые теги p с классом external-text внутри тега body .
Подробнее о селекторах CSS можно узнать здесь.
Объекты BeautifulSoup поддерживают поиск на странице с помощью селекторов CSS с использованием метода select . Мы можем использовать селекторы CSS, чтобы найти все теги p на нашей странице, которые находятся внутри раздел вот так:
суп.выбрать("див п")
[
Первый параграф.
,
Второй абзац.
]
Обратите внимание, что описанный выше метод select возвращает список объектов BeautifulSoup , точно так же, как find и find_all .
Загрузка данных о погоде
Теперь мы знаем достаточно, чтобы приступить к извлечению информации о местной погоде с веб-сайта Национальной метеорологической службы!
Первый шаг — найти страницу, которую мы хотим очистить. С этой страницы мы будем извлекать информацию о погоде в центре Сан-Франциско.
В частности, давайте извлечем данные о расширенном прогнозе.
Как видно из изображения, на странице есть информация о расширенном прогнозе на ближайшую неделю, включая время суток, температуру и краткое описание условий.
Изучение структуры страницы с помощью Chrome DevTools
Первое, что нам нужно сделать, это проверить страницу с помощью Chrome Devtools. Если вы используете другой браузер, у Firefox и Safari есть эквиваленты.
Вы можете запустить инструменты разработчика в Chrome, нажав Вид -> Разработчик -> Инструменты разработчика . Вы должны получить панель в нижней части браузера, подобную той, что вы видите ниже. Убедитесь, что панель Elements выделена:
Инструменты разработчика Chrome
Панель элементов покажет вам все теги HTML на странице и позволит вам перемещаться по ним. Это действительно удобная функция!
Щелкнув правой кнопкой мыши на странице рядом с надписью «Расширенный прогноз», затем нажав «Проверить», мы откроем тег, содержащий текст «Расширенный прогноз», на панели элементов:
Расширенный текст прогноза
Затем мы можем прокрутить панель элементов вверх, чтобы найти «самый внешний» элемент, содержащий весь текст, соответствующий расширенным прогнозам. В данном случае это тег div с идентификатором семидневный прогноз :
.
Раздел, содержащий элементы расширенного прогноза.
Если мы щелкнем по консоли и изучим div, мы обнаружим, что каждый элемент прогноза (например, «Сегодня вечером», «Четверг» и «Четверг вечером») содержится в div с надгробным памятником класса -контейнером .
Пора начинать соскабливать!
Теперь мы знаем достаточно, чтобы загрузить страницу и начать ее разбор. В приведенном ниже коде мы будем:
Загрузите веб-страницу с прогнозом.
Создайте класс BeautifulSoup для анализа страницы.
Найдите div с идентификатором семидневный прогноз и назначьте seven_day
Внутри seven_day найдите каждый отдельный элемент прогноза.
Сегодня вечером
В большей степени ясно
Низкая: 49 °F 90 159
Теперь мы можем извлечь атрибут title из тега img . Для этого мы просто обращаемся с объектом BeautifulSoup как со словарем и передаем нужный нам атрибут в качестве ключа:
img = tonight. find("img")
описание = изображение ['название']
печать (убыль)
Сегодня вечером: Преимущественно ясно, минимум 49 баллов. Западный северо-западный ветер 12-17 миль в час, после полуночи стихает до 6-11 миль в час. Порывы ветра могут достигать 23 м/с.
Извлечение всей информации со страницы
Теперь, когда мы знаем, как извлекать каждый отдельный фрагмент информации, мы можем объединить наши знания с селекторами CSS и списковыми включениями, чтобы извлечь все сразу .
В приведенном ниже коде мы будем:
Выбрать все элементы с классом имя периода внутри элемента с классом надгробный контейнер в семь_день .
Используйте понимание списка для вызова метода get_text для каждого BeautifulSoup объект.
period_tags = seven_day.select(".Контейнер-надгробие .имя-периода")
периоды = [pt.get_text() для pt в period_tags]
периоды
Как мы могли видеть выше, наша методика дает нам каждое из названий периодов по порядку.
Мы можем применить ту же технику, чтобы получить остальные три поля:
short_descs = [sd.get_text() для sd в seven_day.select(".tombstone-container .short-desc")]
temps = [t.get_text() для t в seven_day.select(".tombstone-container .temp")]
descs = [d["title"] for d in seven_day.select(".tombstone-container img")]print(short_descs)print(temps)print(descs)
['Преимущественно ясно', 'Солнечно', 'Практически ясно', 'Солнечно', 'Небольшой возможный дождь', 'Вероятен дождь', 'Вероятен дождь', 'Вероятен дождь', 'Возможен дождь']
['Низкая: 49°F', 'Высокая: 63°F', 'Низкая: 50°F', 'Высокая: 67°F', 'Низкая: 57°F', 'Высокая: 64°F', ' Низкая: 57 °F', «Высокая: 64 °F», «Низкая: 55 °F»]
['Сегодня вечером: в основном ясно, минимум около 49. Ветер западный северо-западный 12-17 м/с, после полуночи стихает до 6-11 м/с. Порывы ветра могут достигать 23 м/с. ', 'Четверг: солнечно, максимум около 63. Северный ветер от 3 до 5 миль в час. ', 'Четверг, ночь: в основном ясно, минимум около 50. Слабый и переменный ветер становится восточно-юго-восточным со скоростью от 5 до 8 миль в час после полуночи. ', 'Пятница: солнечно, максимум около 67. Юго-восточный ветер около 9 м/с. ', 'В пятницу вечером: 20-процентная вероятность дождя после 23:00. Переменная облачность, с низкой температурой 57. Ветер юго-восточный 13-15 м/с, с порывами до 20 м/с. Возможное количество новых осадков менее одной десятой дюйма. ', 'Суббота: возможен дождь. Облачно, максимальная температура около 64. Вероятность осадков 70%. Количество новых осадков может составлять от четверти до половины дюйма. ', 'Субботний вечер: возможен дождь. Облачно, минимальная температура около 57. Вероятность осадков 60%.», «Воскресенье: возможен дождь. Облачно, максимум около 64", "В воскресенье вечером: возможен дождь. Преимущественно облачно, минимум около 55.']
Объединение наших данных в кадр данных Pandas
Теперь мы можем объединить данные в Pandas DataFrame и проанализировать их. DataFrame — это объект, который может хранить табличные данные, что упрощает анализ данных. Если вы хотите узнать больше о Pandas, ознакомьтесь с нашим бесплатным начальным курсом здесь.
Чтобы сделать это, мы вызовем класс DataFrame и передадим каждый список элементов, которые у нас есть. Мы передаем их как часть словаря.
Каждый ключ словаря станет столбцом в DataFrame, а каждый список станет значениями в столбце:
Воскресенье: возможен дождь. Облачно, с высокой близостью…
Воскресенье
Вероятность дождя
Высокая: 64 °F
8
Вечер воскресенья: возможен дождь. Преимущественно облачно…
Воскресенье, ночь
Случайный дождь
Низкая: 55 °F
Теперь мы можем провести некоторый анализ данных. Например, мы можем использовать регулярное выражение и метод Series.str.extract для получения числовых значений температуры:
Вечер воскресенья: возможен дождь. Преимущественно облачно…
Воскресенье, ночь
Случайный дождь
Низкая: 55 °F
55
Правда
Следующие шаги для этого проекта веб-скрейпинга
Если вы дошли до этого места, поздравляем! Теперь у вас должно быть хорошее представление о том, как очищать веб-страницы и извлекать данные. Конечно, еще многому предстоит научиться!
Если вы хотите пойти дальше, хорошим следующим шагом было бы выбрать сайт и попробовать выполнить парсинг в Интернете самостоятельно. Вот несколько хороших примеров данных для парсинга:
Новостные статьи
Спортивные результаты
Прогнозы погоды
Курсы акций
Цены интернет-магазина
Вы также можете просмотреть Национальную метеорологическую службу и посмотреть, какие еще данные можно извлечь со страницы или о своем городе.
В качестве альтернативы, если вы хотите поднять свои навыки парсинга веб-страниц на новый уровень, вы можете пройти наш интерактивный курс, который охватывает как основы парсинга веб-страниц, так и использование Python для подключения к API. Обладая этими двумя навыками, вы сможете собирать множество уникальных и интересных наборов данных с сайтов по всему Интернету!
Изучайте Python правильно.
Изучите Python, написав код Python с первого дня прямо в окне браузера. Это лучший способ выучить Python — убедитесь сами в одном из наших 60+ бесплатных уроков.
Вик является генеральным директором и основателем Dataquest.
Создание парсера веб-страниц с помощью Python — настоящий Python
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Анализ веб-страниц с помощью Beautiful Soup и Python
Невероятное количество данных в Интернете — это богатый ресурс для любой области исследований или личных интересов. Чтобы эффективно собирать эти данные, вам необходимо научиться парсингу веб-страниц . Библиотеки Python , запросы и Beautiful Soup — мощные инструменты для работы. Если вам нравится учиться на практических примерах и вы имеете базовое представление о Python и HTML, то этот учебник для вас.
Из этого руководства вы узнаете, как:
Проверить HTML-структуру целевого сайта с помощью инструментов разработчика вашего браузера
Расшифровать данные, закодированные в URL-адресах
Использовать запросов и Beautiful Soup для извлечения и анализа данных из Интернета
Прохождение конвейера веб-скрейпинга от начала до конца
Создайте сценарий , который извлекает предложения о работе из Интернета и отображает соответствующую информацию в вашей консоли
Работа над этим проектом даст вам знания о процессе и инструментах, необходимых для очистки любого статического веб-сайта во всемирной паутине. Вы можете скачать исходный код проекта, перейдя по ссылке ниже:
Приступим!
Что такое парсинг веб-страниц?
Веб-скрапинг — это процесс сбора информации из Интернета. Даже копирование и вставка текста вашей любимой песни является формой веб-скрейпинга! Однако слова «парсинг» обычно относятся к процессу, который включает в себя автоматизацию. Некоторым веб-сайтам не нравится, когда автоматические парсеры собирают их данные, в то время как другие не возражают.
Если вы уважительно очищаете страницу в образовательных целях, то у вас вряд ли возникнут проблемы. Тем не менее, рекомендуется провести собственное исследование и убедиться, что вы не нарушаете никаких Условий обслуживания, прежде чем начинать крупномасштабный проект.
Удалить рекламу
Причины веб-скрейпинга
Допустим, вы занимаетесь серфингом как в Интернете, так и в реальной жизни и ищете работу. Однако вы не ищете просто любую работу. С мышлением серфера вы ждете идеальной возможности проложить свой путь!
Существует сайт вакансий, который предлагает именно те вакансии, которые вам нужны. К сожалению, новая позиция появляется только один раз в голубую луну, и сайт не предоставляет услугу уведомления по электронной почте. Вы думаете о том, чтобы проверять это каждый день, но это не похоже на самый веселый и продуктивный способ провести время.
К счастью, в мире есть и другие способы применить мышление серфера! Вместо того, чтобы каждый день заглядывать на сайт вакансий, вы можете использовать Python, чтобы автоматизировать повторяющиеся части поиска работы. Автоматизированный просмотр веб-страниц может стать решением для ускорения процесса сбора данных. Вы пишете свой код один раз, и он будет получать нужную вам информацию много раз и со многих страниц.
Напротив, когда вы пытаетесь получить нужную информацию вручную, вы можете потратить много времени на нажатия, прокрутку и поиск, особенно если вам нужны большие объемы данных с веб-сайтов, которые регулярно обновляются новым содержимым. Ручной просмотр веб-страниц может занять много времени и повторений.
В Интернете так много информации, и постоянно добавляется новая информация. Вероятно, вас заинтересуют хотя бы некоторые из этих данных, и большая часть из них доступна только для того, чтобы их взять. Независимо от того, ищете ли вы работу на самом деле или хотите загрузить все тексты песен вашего любимого исполнителя, автоматический просмотр веб-страниц может помочь вам в достижении ваших целей.
Проблемы парсинга веб-страниц
Сеть органически выросла из множества источников. Он сочетает в себе множество различных технологий, стилей и личностей и продолжает расти по сей день. Другими словами, Интернет — это полный бардак! Из-за этого вы столкнетесь с некоторыми проблемами при очистке Интернета:
Разнообразие: Каждый веб-сайт уникален. Хотя вы столкнетесь с общими структурами, которые повторяются, каждый веб-сайт уникален и потребует индивидуального подхода, если вы хотите извлечь соответствующую информацию.
Долговечность: Веб-сайты постоянно меняются. Скажем, вы создали новый блестящий веб-скрейпер, который автоматически выбирает то, что вы хотите, из интересующего вас ресурса. При первом запуске скрипт работает безупречно. Но когда вы запускаете тот же скрипт через некоторое время, вы сталкиваетесь с обескураживающим и длинным набором трассировок!
Нестабильные сценарии — реалистичный сценарий, поскольку многие веб-сайты находятся в активной разработке. Как только структура сайта изменится, ваш парсер не сможет правильно перемещаться по карте сайта или находить нужную информацию. Хорошей новостью является то, что многие изменения на веб-сайтах являются небольшими и поэтапными, поэтому вы, вероятно, сможете обновить свой парсер с минимальными настройками.
Однако имейте в виду, что, поскольку Интернет динамичен, созданные вами парсеры, вероятно, потребуют постоянного обслуживания. Вы можете настроить непрерывную интеграцию для периодического запуска тестов очистки, чтобы гарантировать, что ваш основной скрипт не сломается без вашего ведома.
Альтернатива парсингу веб-страниц: API
Некоторые поставщики веб-сайтов предлагают интерфейсы прикладного программирования (API), которые позволяют вам получать доступ к их данным заранее определенным образом. С помощью API вы можете избежать синтаксического анализа HTML. Вместо этого вы можете получить доступ к данным напрямую, используя такие форматы, как JSON и XML. HTML — это в первую очередь способ визуально представить контент пользователям.
При использовании API процесс, как правило, более стабилен, чем сбор данных с помощью парсинга веб-страниц. Это потому, что разработчики создают API для использования программами, а не человеческими глазами.
Внешний вид сайта может часто меняться, но такое изменение дизайна сайта не влияет на структуру его API. Структура API обычно более постоянна, а значит, это более надежный источник данных сайта.
Однако API также могут изменяться. Проблемы разнообразия и долговечности относятся к API так же, как и к веб-сайтам. Кроме того, гораздо сложнее самостоятельно проверить структуру API, если предоставленная документация некачественная.
Подход и инструменты, необходимые для сбора информации с помощью API, выходят за рамки этого руководства. Чтобы узнать больше об этом, ознакомьтесь с интеграцией API в Python.
Соскребите поддельный сайт вакансий Python
В этом руководстве вы создадите веб-скребок, который извлекает списки вакансий разработчиков программного обеспечения Python с сайта Fake Python Jobs. Это пример сайта с фальшивыми объявлениями о вакансиях, которые вы можете свободно просматривать, чтобы тренировать свои навыки. Ваш парсер проанализирует HTML-код на сайте, чтобы выбрать соответствующую информацию и отфильтровать этот контент по определенным словам.
Примечание: Предыдущая версия этого руководства была посвящена очистке доски объявлений о вакансиях Monster, которая с тех пор изменилась и больше не предоставляет статический HTML-контент. В обновленной версии этого руководства основное внимание уделяется автономному статическому сайту, который гарантированно останется прежним и даст вам надежную площадку для отработки навыков, необходимых для парсинга веб-страниц.
Вы можете очистить любой сайт в Интернете, который вы можете посмотреть, но сложность этого зависит от сайта. Этот учебник предлагает вам введение в парсинг веб-страниц, чтобы помочь вам понять весь процесс. Затем вы можете применить этот же процесс для каждого веб-сайта, который вы хотите очистить.
На протяжении всего обучения вы также столкнетесь с несколькими блоками упражнений . Вы можете щелкнуть, чтобы развернуть их и бросить себе вызов, выполнив описанные там задачи.
Удаление рекламы
Шаг 1. Проверка источника данных
Прежде чем писать какой-либо код на Python, вам нужно познакомиться с веб-сайтом, который вы хотите парсить. Это должно быть вашим первым шагом в любом проекте веб-скрейпинга, которым вы хотите заняться. Вам нужно понимать структуру сайта, чтобы извлекать информацию, которая имеет для вас значение. Начните с открытия сайта, который вы хотите очистить, в своем любимом браузере.
Исследуйте веб-сайт
Щелкните по сайту и взаимодействуйте с ним, как это сделал бы любой типичный искатель работы. Например, вы можете пролистать главную страницу сайта:
Вы можете увидеть множество объявлений о вакансиях в формате карточки, и у каждого из них есть две кнопки. Если вы нажмете Применить , вы увидите новую страницу с более подробным описанием выбранной работы. Вы также можете заметить, что URL-адрес в адресной строке вашего браузера меняется, когда вы взаимодействуете с веб-сайтом.
Расшифровать информацию в URL-адресах
Программист может закодировать много информации в URL. Ваше путешествие по парсингу будет намного проще, если вы сначала ознакомитесь с тем, как работают URL-адреса и из чего они сделаны. Например, вы можете оказаться на странице сведений со следующим URL-адресом:
Вы можете разделить приведенный выше URL-адрес на две основные части:
Базовый URL представляет собой путь к функциям поиска на веб-сайте. В приведенном выше примере базовый URL-адрес — https://realpython.github.io/fake-jobs/.
Конкретное местоположение сайта , оканчивающееся на .html , является путем к уникальному ресурсу описания вакансии.
Любая вакансия, размещенная на этом веб-сайте, будет использовать один и тот же базовый URL-адрес. Однако расположение уникальных ресурсов будет отличаться в зависимости от того, какую конкретную вакансию вы просматриваете.
URL-адреса могут содержать больше информации, чем просто расположение файла. Некоторые веб-сайты используют параметры запроса для кодирования значений, которые вы отправляете при выполнении поиска. Вы можете думать о них как о строках запроса, которые вы отправляете в базу данных для получения определенных записей.
Вы найдете параметры запроса в конце URL-адреса. Например, если вы зайдете на сайт Indeed и выполните поиск «разработчик программного обеспечения» в «Австралия» через их строку поиска, вы увидите, что URL-адрес изменится, чтобы включить эти значения в качестве параметров запроса:
Параметры запроса в этом URL-адресе: ?q=software+developer&l=Австралия . Параметры запроса состоят из трех частей:
Начало: Начало параметров запроса обозначается знаком вопроса ( ? ).
Информация: Элементы информации, составляющие один параметр запроса, закодированы в парах ключ-значение, где связанные ключи и значения объединены знаком равенства ( ключ=значение ).
Разделитель: Каждый URL-адрес может иметь несколько параметров запроса, разделенных символом амперсанда ( и ).
Имея эту информацию, вы можете разделить параметры запроса URL на две пары ключ-значение:
q=программное обеспечение+разработчик выбирает тип задания.
l=Австралия выбирает местоположение задания.
Попробуйте изменить параметры поиска и посмотрите, как это повлияет на ваш URL. Продолжайте и введите новые значения в строке поиска вверху:
Измените эти значения, чтобы наблюдать за изменениями в URL-адресе.
Затем попробуйте изменить значения непосредственно в URL-адресе. Посмотрите, что произойдет, если вы вставите следующий URL-адрес в адресную строку браузера:
.
https://au.indeed.com/jobs?q=developer&l=perth
Если вы измените и отправите значения в поле поиска веб-сайта, это будет напрямую отражено в параметрах запроса URL-адреса и наоборот. Если вы измените любой из них, вы увидите другие результаты на веб-сайте.
Как видите, изучение URL-адресов сайта может дать вам представление о том, как получить данные с сервера веб-сайта.
Вернитесь к Fake Python Jobs и продолжите изучение. Этот сайт является чисто статическим веб-сайтом, который не работает поверх базы данных, поэтому вам не придется работать с параметрами запроса в этом руководстве по парсингу.
Удалить рекламу
Проверить сайт с помощью инструментов разработчика
Далее вам нужно больше узнать о том, как данные структурированы для отображения. Вам нужно будет понять структуру страницы, чтобы выбрать то, что вы хотите из HTML-ответа, который вы соберете на одном из следующих шагов.
Инструменты разработчика могут помочь вам понять структуру веб-сайта. Все современные браузеры поставляются с установленными инструментами разработчика. В этом разделе вы узнаете, как работать с инструментами разработчика в Chrome. Процесс будет очень похож на другие современные браузеры.
В Chrome на macOS вы можете открыть инструменты разработчика через меню, выбрав Просмотр → Разработчик → Инструменты разработчика . В Windows и Linux вы можете получить к ним доступ, нажав кнопку меню в правом верхнем углу ( ⋮ ) и выбрав Дополнительные инструменты → Инструменты разработчика . Вы также можете получить доступ к инструментам разработчика, щелкнув правой кнопкой мыши страницу и выбрав параметр Inspect или используя сочетание клавиш:
.
Mac: Cmd + Alt + I
Windows/Linux: Ctrl + Shift + I
Инструменты разработчика позволяют вам в интерактивном режиме исследовать объектную модель документа (DOM) сайта, чтобы лучше понять ваш источник. Чтобы копаться в DOM вашей страницы, выберите Вкладка Elements в инструментах разработчика. Вы увидите структуру с интерактивными элементами HTML. Вы можете разворачивать, сворачивать и даже редактировать элементы прямо в браузере:
HTML справа представляет структуру страницы, которую вы видите слева.
Вы можете думать о тексте, отображаемом в вашем браузере, как о структуре HTML этой страницы. Если вам интересно, вы можете больше узнать о разнице между DOM и HTML на странице CSS-TRICKS.
Когда вы щелкаете правой кнопкой мыши элементы на странице, вы можете выбрать Осмотрите , чтобы приблизиться к их расположению в DOM. Вы также можете навести курсор мыши на текст HTML справа и увидеть, как соответствующие элементы загораются на странице.
Нажмите, чтобы развернуть блок упражнений для конкретной задачи, чтобы попрактиковаться в использовании инструментов разработчика:
Найдите одну вакансию. В какой HTML-элемент он заключен и какие другие HTML-элементы он содержит?
Играй и исследуй! Чем больше вы узнаете страницу, с которой работаете, тем легче будет ее парсить. Однако не перегружайтесь всем этим HTML-текстом. Вы будете использовать возможности программирования, чтобы пройти через этот лабиринт и отобрать наиболее важную для вас информацию.
Шаг 2. Извлечение содержимого HTML со страницы
Теперь, когда у вас есть представление о том, с чем вы работаете, пришло время начать использовать Python. Во-первых, вы захотите добавить HTML-код сайта в свой скрипт Python, чтобы иметь возможность взаимодействовать с ним. Для этой задачи вы будете использовать библиотеку запросов Python.
Перед установкой любого внешнего пакета создайте виртуальную среду для своего проекта. Активируйте новую виртуальную среду, затем введите следующую команду в своем терминале, чтобы установить внешний запросов библиотека:
$ python -m pip запросы на установку
Затем откройте новый файл в своем любимом текстовом редакторе. Все, что вам нужно для извлечения HTML, — это несколько строк кода:
Этот код отправляет HTTP-запрос GET на указанный URL-адрес. Он извлекает данные HTML, которые сервер отправляет обратно, и сохраняет эти данные в объекте Python.
Если вы напечатаете атрибут .text страницы , то заметите, что он выглядит точно так же, как HTML, который вы проверили ранее с помощью инструментов разработчика вашего браузера. Вы успешно загрузили статическое содержимое сайта из Интернета! Теперь у вас есть доступ к HTML-коду сайта из вашего скрипта Python.
Удалить рекламу
Статические веб-сайты
Веб-сайт, который вы изучаете в этом руководстве, содержит статический HTML-контент . В этом сценарии сервер, на котором размещен сайт, отправляет обратно HTML-документы, которые уже содержат все данные, которые вы увидите как пользователь.
Когда вы ранее просматривали страницу с инструментами разработчика, вы обнаружили, что объявление о вакансии состоит из следующего длинного и беспорядочного HTML-кода:
<р>
<нижний колонтитул>
<а
href="https://www.realpython.com"
цель = "_ пусто"
>Узнать
<а
href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
цель = "_ пусто"
>Применить
нижний колонтитул>
Может быть сложно разобраться в длинном блоке HTML-кода. Чтобы упростить чтение, вы можете использовать средство форматирования HTML для автоматической очистки. Хорошая читабельность помогает лучше понять структуру любого блока кода. Хотя это может помочь или не помочь улучшить форматирование HTML, всегда стоит попробовать.
Примечание: Имейте в виду, что каждый веб-сайт будет выглядеть по-разному. Вот почему необходимо изучить и понять структуру сайта, с которым вы сейчас работаете, прежде чем двигаться дальше.
Иногда HTML-код, с которым вы столкнетесь, будет сбивать с толку. К счастью, HTML-код этой доски объявлений содержит описательные имен классов для элементов, которые вас интересуют:
class="title is-5" содержит название вакансии.
class="subtitle is-6 company" содержит название компании, которая предлагает вакансию.
class="location" содержит место, где вы будете работать.
Если вы когда-нибудь потеряетесь в большой куче HTML, помните, что вы всегда можете вернуться в свой браузер и использовать инструменты разработчика для дальнейшего интерактивного изучения структуры HTML.
К настоящему моменту вы успешно освоили мощный и удобный дизайн библиотеки запросов Python. С помощью всего нескольких строк кода вам удалось извлечь статический HTML-контент из Интернета и сделать его доступным для дальнейшей обработки.
Однако существуют более сложные ситуации, с которыми вы можете столкнуться при парсинге веб-сайтов. Прежде чем вы научитесь извлекать релевантную информацию из только что извлеченного HTML-кода, вы кратко рассмотрите две из этих более сложных ситуаций.
Скрытые сайты
Некоторые страницы содержат информацию, скрытую за логином. Это означает, что вам понадобится учетная запись, чтобы иметь возможность очистить что-либо со страницы. Процесс выполнения HTTP-запроса из вашего скрипта Python отличается от того, как вы получаете доступ к странице из браузера. Тот факт, что вы можете войти на страницу через браузер, не означает, что вы сможете очистить ее с помощью скрипта Python.
Однако библиотека запросов поставляется со встроенной возможностью обработки аутентификации. С помощью этих методов вы можете входить на веб-сайты при выполнении HTTP-запроса из своего скрипта Python, а затем очищать информацию, скрытую за логином. Вам не нужно будет входить в систему, чтобы получить доступ к информации о доске объявлений, поэтому в этом руководстве не рассматривается аутентификация.
Динамические веб-сайты
В этом руководстве вы узнаете, как очистить статический веб-сайт. Статические сайты просты в работе, потому что сервер отправляет вам HTML-страницу, которая уже содержит всю информацию о странице в ответе. Вы можете проанализировать этот HTML-ответ и сразу же начать выбирать соответствующие данные.
С другой стороны, с динамическим веб-сайтом сервер может вообще не отправлять HTML-код. Вместо этого вы можете получить код JavaScript в качестве ответа. Этот код будет выглядеть совершенно иначе, чем то, что вы видели, просматривая страницу с помощью инструментов разработчика вашего браузера.
Примечание: В этом руководстве термин динамический веб-сайт относится к веб-сайту, который не возвращает тот же HTML-код, который вы видите при просмотре страницы в браузере.
Многие современные веб-приложения спроектированы таким образом, чтобы обеспечить их функциональность во взаимодействии с клиентскими браузерами. Вместо отправки HTML-страниц эти приложения отправляют код JavaScript , который указывает вашему браузеру создать нужный HTML-код. Веб-приложения доставляют динамический контент таким образом, чтобы переложить работу с сервера на компьютеры клиентов, а также избежать перезагрузки страниц и улучшить общее взаимодействие с пользователем.
То, что происходит в браузере, отличается от того, что происходит в вашем скрипте. Ваш браузер будет старательно выполнять код JavaScript, который он получает с сервера, и создавать для вас DOM и HTML локально. Однако если вы запросите динамический веб-сайт в своем скрипте Python, вы не получите содержимое HTML-страницы.
Когда вы используете запросов , вы получаете только то, что сервер отправляет обратно. В случае динамического веб-сайта вы получите некоторый код JavaScript вместо HTML. Единственный способ перейти от полученного кода JavaScript к интересующему вас контенту — это выполните код, как это делает ваш браузер. Библиотека запросов не может сделать это за вас, но есть другие решения, которые могут.
Например, Requests-HTML — это проект, созданный автором библиотеки Requests , который позволяет отображать JavaScript с использованием синтаксиса, похожего на синтаксис Requests . Он также включает возможности анализа данных с использованием Beautiful Soup под капотом.
Примечание: Другим популярным выбором для парсинга динамического контента является Selenium. Вы можете думать о Selenium как об упрощенном браузере, который выполняет за вас код JavaScript, прежде чем передать обработанный HTML-ответ вашему скрипту.
В этом руководстве вы не будете углубляться в парсинг динамически сгенерированного контента. На данный момент достаточно не забыть изучить один из вариантов, упомянутых выше, если вам нужно очистить динамический веб-сайт.
Удалить рекламу
Шаг 3. Разбор HTML-кода с помощью Beautiful Soup
Вы успешно скопировали HTML-код из Интернета, но когда вы смотрите на него, он кажется огромным беспорядком. Здесь и там есть тонны HTML-элементов, тысячи атрибутов, разбросанных повсюду, и не было ли примешано еще и JavaScript? Пришло время проанализировать этот длинный ответ кода с помощью Python, чтобы сделать его более доступным и выбрать нужные данные.
Beautiful Soup — это библиотека Python для разбор структурированных данных . Это позволяет вам взаимодействовать с HTML аналогично тому, как вы взаимодействуете с веб-страницей с помощью инструментов разработчика. Библиотека предоставляет несколько интуитивно понятных функций, которые вы можете использовать для изучения полученного HTML-кода. Для начала используйте свой терминал для установки Beautiful Soup:
.
$ python -m pip установить BeautifulSoup4
Затем импортируйте библиотеку в свой скрипт Python и создайте объект Beautiful Soup:
запросов на импорт
из bs4 импортировать BeautifulSoup
URL = "https://realpython. github.io/fake-jobs/"
страница = запросы.get(URL)
суп = BeautifulSoup(page.content, "html.parser")
Когда вы добавляете две выделенные строки кода, вы создаете объект Beautiful Soup, который принимает page.content , то есть HTML-контент, который вы очистили ранее, в качестве входных данных.
Примечание: Вам нужно передать page.content вместо page.text , чтобы избежать проблем с кодировкой символов. Атрибут .content содержит необработанные байты, которые могут быть декодированы лучше, чем текстовое представление, напечатанное ранее с использованием .text 9.0108 атрибут.
Второй аргумент, "html.parser" , гарантирует, что вы используете соответствующий парсер для содержимого HTML.
Найти элементы по ID
На веб-странице HTML каждому элементу может быть назначен атрибут id . Как следует из названия, этот атрибут id делает элемент уникально идентифицируемым на странице. Вы можете начать парсить свою страницу, выбрав определенный элемент по его ID.
Вернитесь к инструментам разработчика и определите объект HTML, содержащий все объявления о вакансиях. Исследуйте, наведя курсор на части страницы и щелкнув правой кнопкой мыши Проверить .
Примечание: Это помогает периодически переключаться обратно в браузер и интерактивно исследовать страницу с помощью инструментов разработчика. Это поможет вам научиться находить именно те элементы, которые вы ищете.
Элемент, который вы ищете, представляет собой
с атрибутом id со значением "ResultsContainer" . У него есть и другие атрибуты, но ниже приведена суть того, что вы ищете:.
<дел>
Beautiful Soup позволяет найти этот конкретный HTML-элемент по его ID:
.
результатов = суп.найти(id="ResultsContainer")
Для облегчения просмотра вы можете распечатать любой объект Beautiful Soup. Если вы вызовете .prettify() для переменной results , которую вы только что присвоили выше, вы увидите весь HTML, содержащийся в
:.
печать (результаты.prettify())
Когда вы используете идентификатор элемента, вы можете выбрать один элемент из остального HTML. Теперь вы можете работать только с этой конкретной частью HTML страницы. Кажется, суп стал немного жиже! Тем не менее, он все еще довольно плотный.
Удалить рекламу
Поиск элементов по имени класса HTML
Вы видели, что каждое объявление о вакансии заключено в элемент
с классом card-content . Теперь вы можете работать со своим новым объектом под названием results и выбирать в нем только объявления о вакансиях. В конце концов, это те части HTML, которые вас интересуют! Вы можете сделать это в одной строке кода:
Здесь вы вызываете .find_all() для объекта Beautiful Soup, который возвращает итерацию, содержащую весь HTML для всех списков вакансий, отображаемых на этой странице.
Взгляните на них всех:
для job_element в job_elements:
печать (элемент_задания, конец = "\n" * 2)
Уже неплохо, но HTML еще много! Ранее вы видели, что некоторые элементы вашей страницы имеют описательные имена классов. Вы можете выбрать эти дочерние элементы из каждой публикации о вакансии с помощью .найти() :
Каждый job_element является другим объектом BeautifulSoup() . Следовательно, вы можете использовать для него те же методы, что и для его родительского элемента, результаты .
С помощью этого фрагмента кода вы становитесь все ближе и ближе к данным, которые вас действительно интересуют. Тем не менее, со всеми этими HTML-тегами и атрибутами, плавающими вокруг, происходит многое:
Старший разработчик Python
Пейн, Робертс и Дэвис
Стюартбери, штат АА
Далее вы узнаете, как сузить этот вывод, чтобы получить доступ только к интересующему вас текстовому содержимому.
Извлечение текста из элементов HTML
Вы хотите видеть только название, компанию и местоположение каждой вакансии. И вот! Beautiful Soup поможет вам. Вы можете добавить .text к объекту Beautiful Soup, чтобы вернуть только текстовое содержимое HTML-элементов, содержащихся в объекте:
Запустите приведенный выше фрагмент кода, и вы увидите текст каждого отображаемого элемента. Однако возможно, что вы также получите дополнительные пробелов . Поскольку теперь вы работаете со строками Python, вы можете .strip() лишние пробелы. Вы также можете применить любые другие знакомые строковые методы Python для дальнейшей очистки вашего текста:
Старший разработчик Python
Пейн, Робертс и Дэвис
Стюартбери, АА
Инженер-энергетик
Васкес-Дэвидсон
Кристофервиль, АА
Юридический исполнитель
Джексон, Чемберс и Леви
Порт-Эрикабург, АА
Это удобочитаемый список вакансий, который также включает название компании и местонахождение каждой вакансии. Однако вы ищете должность разработчика программного обеспечения, и эти результаты также содержат объявления о вакансиях во многих других областях.
Удаление рекламы
Поиск элементов по имени класса и текстовому содержимому
Не все списки вакансий являются вакансиями разработчиков. Вместо того, чтобы распечатывать всех вакансий, перечисленных на веб-сайте, вы сначала отфильтруете их по ключевым словам.
Вы знаете, что названия должностей на странице хранятся в пределах элементов. Чтобы отфильтровать только определенные задания, вы можете использовать аргумент строки :
Этот код находит все элементы , в которых содержащаяся строка точно соответствует "Python" . Обратите внимание, что вы напрямую вызываете метод для своей первой переменной results . Если вы продолжите и print() выведете приведенный выше фрагмент кода на свою консоль, то вы можете быть разочарованы, потому что он будет пустым:
>>>
>>> печать (python_jobs)
[]
Там было вакансия Python в результатах поиска, так почему же она не отображается?
Когда вы используете string= , как вы делали выше, ваша программа ищет эту строку точно . Любые различия в написании, использовании заглавных букв или пробелов не позволят элементу сопоставляться. В следующем разделе вы найдете способ сделать строку поиска более общей.
Передать функцию красивому методу супа
В дополнение к строкам вы можете иногда передавать функции в качестве аргументов методам Beautiful Soup. Вы можете изменить предыдущую строку кода, чтобы использовать вместо нее функцию:
python_jobs = results.find_all(
"h3", string=лямбда-текст: "python" в text.lower()
)
Теперь вы передаете анонимную функцию аргументу string= . Лямбда-функция просматривает текст каждого элемента , преобразует его в нижний регистр и проверяет, встречается ли где-нибудь подстрока "python" . Вы можете проверить, удалось ли вам идентифицировать все задания Python с помощью этого подхода:
>>>
>>> печать (длина (python_jobs))
10
Ваша программа нашла 10 подходящих объявлений о вакансиях, в названии которых есть слово "python" !
Поиск элементов в зависимости от их текстового содержимого — это мощный способ фильтрации вашего HTML-ответа для получения определенной информации. Beautiful Soup позволяет использовать либо точные строки, либо функции в качестве аргументов для фильтрации текста в объектах Beautiful Soup.
Однако, когда вы попытаетесь запустить парсер для вывода информации об отфильтрованных заданиях Python, вы столкнетесь с ошибкой:
AttributeError: объект «NoneType» не имеет атрибута «текст»
Это сообщение является распространенной ошибкой, с которой вы часто сталкиваетесь при извлечении информации из Интернета. Проверьте HTML элемента в списке python_jobs . На что это похоже? Как вы думаете, откуда берется ошибка?
Определение условий ошибки
Когда вы посмотрите на один элемент в python_jobs , вы увидите, что он состоит только из
9Элемент 0108, содержащий название должности:
Старший разработчик Python
Когда вы вернетесь к коду, который вы использовали для выбора элементов, вы увидите, что это то, на что вы нацелились. Вы отфильтровали только элементов заголовка объявлений о вакансиях, содержащих слово "python" . Как видите, эти элементы не включают остальную информацию о задании.
Сообщение об ошибке, которое вы получили ранее, было связано с этим:
AttributeError: объект «NoneType» не имеет атрибута «текст»
Вы пытались найти должность, название компании и место работы в каждом элементе python_jobs , но каждый элемент содержит только текст названия должности.
Ваша усердная библиотека синтаксического анализа по-прежнему ищет и другие и возвращает None , потому что не может их найти. Затем print() завершается с ошибкой с показанным сообщением об ошибке при попытке извлечь .text атрибут одного из этих объектов None .
Текст, который вы ищете, вложен в одноуровневые элементы элементов, возвращенных вашим фильтром. Beautiful Soup может помочь вам выбрать родственные, дочерние и родительские элементы каждого объекта Beautiful Soup.
Удалить рекламу
Доступ к родительским элементам
Один из способов получить доступ ко всей необходимой информации — подняться в иерархии DOM, начиная с элементов, которые вы идентифицировали. Взгляните еще раз на HTML-код одного объявления о вакансии. Найдите элемент , который содержит название должности, а также его ближайший родительский элемент, содержащий всю интересующую вас информацию:
<нижний колонтитул>
<а
href="https://www.realpython.com"
цель = "_ пусто"
>Узнать
<а
href="https://realpython.github.io/fake-jobs/jobs/senior-python-developer-0.html"
цель = "_ пусто"
>Применить
нижний колонтитул>
Элемент
с классом card-content содержит всю необходимую информацию. Это родитель третьего уровня элемента заголовка , который вы нашли с помощью фильтра.
Имея в виду эту информацию, теперь вы можете использовать элементы в python_jobs и вместо этого извлекать их прародительские элементы, чтобы получить доступ ко всей информации, которую вы хотите:
python_jobs = results. find_all(
"h3", string=лямбда-текст: "python" в text.lower()
)
python_job_elements = [
h3_element.parent.parent.parent для h3_element в python_jobs
]
Вы добавили понимание списка, которое работает с каждым из элементов заголовка в python_jobs , которые вы получили путем фильтрации с помощью лямбда-выражения. Вы выбираете родительский элемент родительского элемента родительского элемента каждого элемента заголовка . Это три поколения!
Когда вы просматривали HTML-код одной публикации о вакансии, вы определили, что этот конкретный родительский элемент с именем класса card-content содержит всю необходимую информацию.
Теперь вы можете адаптировать код в цикле for для перебора родительских элементов:
для job_element в python_job_elements:
# -- отрезать --
Когда вы запустите свой сценарий еще раз, вы увидите, что ваш код снова имеет доступ ко всей соответствующей информации. Это потому, что вы теперь перебираете 90 107 элементов
90 108, а не только 90 107 элементов заголовка
90 108.
Использование атрибута .parent , который поставляется с каждым объектом Beautiful Soup, дает вам интуитивно понятный способ пошагового перемещения по структуре DOM и обращения к нужным элементам. Вы также можете получить доступ к дочерним элементам и родственным элементам аналогичным образом. Прочтите о навигации по дереву для получения дополнительной информации.
Извлечение атрибутов из элементов HTML
К этому моменту ваш скрипт Python уже очищает сайт и фильтрует его HTML на наличие релевантных объявлений о вакансиях. Отличная работа! Однако чего по-прежнему не хватает, так это ссылки для подачи заявки на работу.
При просмотре страницы вы обнаружили по две ссылки внизу каждой карточки. Если вы обрабатываете элементы ссылки так же, как и другие элементы, вы не получите интересующие вас URL-адреса:
для job_element в python_job_elements:
# -- отрезать --
ссылки = job_element. find_all ("а")
для ссылки в ссылках:
печать (ссылка.текст.полоса())
Если вы запустите этот фрагмент кода, вы получите тексты ссылок Learn и Apply вместо связанных URL-адресов.
Это потому, что атрибут .text оставляет только видимое содержимое HTML-элемента. Он удаляет все теги HTML, включая атрибуты HTML, содержащие URL-адрес, и оставляет вам только текст ссылки. Чтобы вместо этого получить URL-адрес, вам нужно извлечь значение одного из атрибутов HTML, а не отбрасывать его.
URL-адрес элемента ссылки связан с атрибутом href . Конкретный URL-адрес, который вы ищете, является значением href атрибут второго тега внизу HTML одной публикации о вакансии:
<нижний колонтитул>
Узнать html"
цель = "_ пусто"
>Применить
нижний колонтитул>
Начните с получения всех элементов в карточке задания. Затем извлеките значение их атрибутов href , используя нотацию с квадратными скобками:
для job_element в python_job_elements:
# -- отрезать --
ссылки = job_element.find_all ("а")
для ссылки в ссылках:
link_url = ссылка["href"]
print(f"Применить здесь: {link_url}\n")
В этом фрагменте кода вы сначала получили все ссылки из каждого из отфильтрованных объявлений о вакансиях. Затем вы извлекли атрибут href , который содержит URL-адрес, используя ["href"] и распечатал его на своей консоли.
В приведенном ниже блоке упражнений вы можете найти инструкции по уточнению результатов ссылки, которые вы получили:
С каждой картой задания связаны две ссылки. Вы ищете только ссылку секунд . Как отредактировать показанный выше фрагмент кода, чтобы всегда собирать только URL-адрес второй ссылки?
Нажмите на блок решения, чтобы прочитать о возможном решении для этого упражнения:
Чтобы получить URL только второй ссылки для каждой карточки задания, вы можете использовать следующий фрагмент кода:
для job_element в python_job_elements:
link_url = job_element. find_all("a")[1]["href"]
print(f"Применить здесь: {link_url}\n")
Вы выбираете второй элемент ссылки из результатов .find_all() по его индексу ( [1] ). Затем вы напрямую извлекаете URL-адрес, используя нотацию с квадратными скобками и обращаясь к атрибут href ( ["href"] ).
Вы можете использовать ту же нотацию с квадратными скобками для извлечения других атрибутов HTML.
Удалить рекламу
Продолжать тренироваться
Если вы написали код вместе с этим руководством, вы можете запустить свой сценарий как есть, и вы увидите всплывающую информацию о поддельном задании в своем терминале. Ваш следующий шаг - заняться реальной доской объявлений ! Чтобы продолжать практиковать свои новые навыки, повторите процесс парсинга веб-страниц, используя любой или все из следующих сайтов:
PythonJobs
Пульт (точка) co
Действительно
Веб-сайты, на которые ведут ссылки, возвращают результаты поиска в виде статических HTML-ответов, подобно доске объявлений Fake Python. Поэтому их можно парсить, используя только запросов и Beautiful Soup.
Начните заново проходить это руководство с самого начала, используя один из этих других сайтов. Вы увидите, что структура каждого веб-сайта отличается, и вам нужно будет перестроить код немного по-другому, чтобы получить нужные данные. Решение этой задачи — отличный способ попрактиковаться в концепциях, которые вы только что изучили. Хотя это может заставить вас потеть время от времени, ваши навыки кодирования будут сильнее благодаря этому!
Во время второй попытки вы также сможете изучить дополнительные функции Beautiful Soup. Используйте документацию в качестве руководства и источника вдохновения. Дополнительная практика поможет вам стать более опытным в парсинге веб-страниц с использованием Python, запросов и Beautiful Soup.
Чтобы завершить свое путешествие в веб-скрапинг, вы можете затем окончательно изменить свой код и создать интерфейс командной строки (CLI) приложение, которое очищает одну из досок вакансий и фильтрует результаты по ключевому слову, которое вы можете ввести. на каждом исполнении. Ваш инструмент CLI может позволить вам искать определенные типы рабочих мест или рабочих мест в определенных местах.
Если вы хотите узнать, как адаптировать свой сценарий в качестве интерфейса командной строки, ознакомьтесь с разделом Как создавать интерфейсы командной строки в Python с помощью argparse.
Заключение
Библиотека запросов предоставляет удобный способ получения статического HTML из Интернета с помощью Python. Затем вы можете проанализировать HTML с помощью другого пакета Beautiful Soup. Оба пакета являются надежными и полезными компаньонами для ваших приключений в Интернете. Вы обнаружите, что Beautiful Soup удовлетворит большинство ваших потребностей в анализе, включая навигацию и расширенный поиск.
В этом руководстве вы узнали, как собирать данные из Интернета с помощью Python, запросов и Beautiful Soup. Вы создали скрипт, который извлекает объявления о вакансиях из Интернета, и прошли весь процесс парсинга веб-страниц от начала до конца.
Вы научились:
Пошаговое выполнение конвейера очистки веб-страниц от начала до конца
Проверьте HTML-структуру вашего целевого сайта с помощью вашего браузера инструменты разработчика
Расшифровать данные, закодированные в URL-адресах
Загрузите HTML-контент страницы , используя библиотеку Python запросов
Разобрать загруженный HTML-код с помощью Beautiful Soup для извлечения соответствующей информации
Создайте сценарий , который извлекает предложения о работе из Интернета и отображает соответствующую информацию в вашей консоли
Имея в виду этот широкий конвейер и две мощные библиотеки в своем наборе инструментов, вы можете пойти и посмотреть, какие еще веб-сайты вы можете очистить. Получайте удовольствие и всегда помните, что нужно проявлять уважение и ответственно использовать свои навыки программирования.
Вы можете скачать исходный код примера скрипта, который вы создали в этом руководстве, щелкнув ссылку ниже:
Смотреть сейчас Это руководство содержит связанный с ним видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным учебным пособием, чтобы углубить свое понимание: Парсинг веб-страниц с помощью Beautiful Soup и Python
Реализация парсинга веб-страниц в Python с помощью BeautifulSoup
Существует два основных способа извлечения данных с веб-сайта:
Используйте API веб-сайта (если он существует). Например, у Facebook есть API Facebook Graph, который позволяет извлекать данные, размещенные на Facebook.
Получите доступ к HTML-странице веб-страницы и извлеките из нее полезную информацию/данные. Этот метод называется веб-скрапингом, веб-сбором или извлечением веб-данных.
В этой статье обсуждаются шаги, связанные с очисткой веб-страниц с использованием реализации платформы веб-очистки Python под названием Beautiful Soup. Шагов, связанных с парсингом веб-страниц:
Отправьте HTTP-запрос на URL-адрес веб-страницы, к которой вы хотите получить доступ. Сервер отвечает на запрос, возвращая HTML-контент веб-страницы. Для этой задачи мы будем использовать стороннюю HTTP-библиотеку для python-запросов.
После того, как мы получили доступ к содержимому HTML, нам остается выполнить синтаксический анализ данных. Поскольку большая часть данных HTML является вложенной, мы не можем извлекать данные просто посредством обработки строк. Нужен синтаксический анализатор, который может создавать вложенную/древовидную структуру данных HTML. Существует много доступных библиотек парсеров HTML, но самой продвинутой из них является html5lib.
Теперь все, что нам нужно сделать, это перемещаться и искать созданное нами дерево синтаксического анализа, то есть обход дерева. Для этой задачи мы будем использовать другую стороннюю библиотеку Python, Beautiful Soup. Это библиотека Python для извлечения данных из файлов HTML и XML.
Шаг 1: Установка необходимых сторонних библиотек
Самый простой способ установить внешние библиотеки в Python — использовать pip. pip — это система управления пакетами, используемая для установки и управления программными пакетами, написанными на Python. Все, что вам нужно сделать, это:
запросы на установку pip
пип установить html5lib
PIP Install BS4
Другой способ заключается в том, чтобы загрузить их вручную по этим ссылкам:
Запросы
HTML5LIB
BeautifulSoup4
Шаг 2: Доступ к контенту HTML от WebPPAGE
. чтобы понять этот кусок кода.
Прежде всего импортируйте библиотеку запросов.
Затем укажите URL-адрес веб-страницы, которую вы хотите очистить.
Отправьте HTTP-запрос на указанный URL-адрес и сохраните ответ от сервера в объекте ответа с именем r.
Теперь напечатайте r. content, чтобы получить необработанный HTML-контент веб-страницы. Он относится к типу «строк».
Примечание. Иногда вы можете получить сообщение об ошибке «Не принято», поэтому попробуйте добавить пользовательский агент браузера, как показано ниже. Найдите свой пользовательский агент в зависимости от устройства и браузера здесь https://deviceatlas.com/blog/list-of-user-agent-strings
A really nice thing о библиотеке BeautifulSoup заключается в том, что она построена на основе библиотек синтаксического анализа HTML, таких как html5lib, lxml, html.parser и т. д. Таким образом, объект BeautifulSoup и указать библиотеку синтаксического анализатора можно создать одновременно. В приведенном выше примере
суп = BeautifulSoup(r.content, 'html5lib')
Мы создаем объект BeautifulSoup, передавая два аргумента:
r.content : Это необработанный HTML-контент.
html5lib : указание парсера HTML, который мы хотим использовать.
Теперь soap.prettify() печатается, дает визуальное представление дерева синтаксического анализа, созданного из необработанного содержимого HTML. Шаг 4. Поиск и навигация по дереву синтаксического анализа Теперь мы хотели бы извлечь некоторые полезные данные из содержимого HTML. Суп-объект содержит все данные во вложенной структуре, которые можно извлечь программно. В нашем примере мы очищаем веб-страницу, состоящую из нескольких цитат. Итак, мы хотели бы создать программу для сохранения этих котировок (и всей соответствующей информации о них).
Прежде чем двигаться дальше, мы рекомендуем вам просмотреть HTML-содержимое веб-страницы, которую мы напечатали с помощью метода sup. prettify(), и попытаться найти шаблон или способ перехода к кавычкам.
Замечено, что все кавычки находятся внутри контейнера div с идентификатором all_quotes. Итак, мы находим этот элемент div (называемый таблицей в приведенном выше коде), используя метод find() :
Первый аргумент — это HTML-тег, который вы хотите найти, а второй аргумент — это элемент словарного типа для указания дополнительных атрибутов, связанных с этим тегом. Метод find() возвращает первый соответствующий элемент. Вы можете попробовать напечатать table.prettify() , чтобы понять, что делает этот фрагмент кода.
Теперь в элементе table можно заметить, что каждая цитата находится внутри контейнера div, классом которого является quote. Итак, мы перебираем каждый контейнер div, чей класс — кавычка. Здесь мы используем метод findAll(), который похож на метод find с точки зрения аргументов, но возвращает список всех совпадающих элементов. Каждая котировка теперь повторяется с использованием переменной с именем 9.0017 ряд. Вот пример HTML-содержимого строки для лучшего понимания: Теперь рассмотрим этот фрагмент кода:
Мы создаем словарь для сохранения всей информации о цитате. Доступ к вложенной структуре можно получить с помощью записи через точку. Чтобы получить доступ к тексту внутри элемента HTML, мы используем .text :
quote['theme'] = row.h5.text
Мы можем добавлять, удалять, изменять и получать доступ к атрибутам тега. Это делается путем обработки тега как словаря:
quote['url'] = row. a['href']
Наконец, все кавычки добавляются в список с именем цитаты.
Наконец, мы хотели бы сохранить все наши данные в каком-нибудь файле CSV.
имя файла = 'inspirational_quotes.csv'
с открытым (имя файла, 'w', новая строка = '') как f:
w = csv.DictWriter(f,['тема','url','img','строки','автор'])
w.заголовок()
для цитаты в кавычках:
w.writerow(quote)
Здесь мы создаем CSV-файл с именем вдохновляющий_quotes.csv и сохраняем в нем все цитаты для дальнейшего использования.
Итак, это был простой пример создания парсера на Python. Отсюда вы можете попытаться удалить любой другой веб-сайт по вашему выбору. В случае возникновения каких-либо вопросов, опубликуйте их ниже в разделе комментариев.
Примечание: Веб-скрапинг во многих случаях считается незаконным. Это также может привести к тому, что ваш IP-адрес будет навсегда заблокирован веб-сайтом. Этот блог создан Nikhil Kumar . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью с помощью write.geeksforgeeks.org или отправить ее по адресу review-team@geeksforgeeks.org. Посмотрите, как ваша статья появится на главной странице GeeksforGeeks, и помогите другим гикам. Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
Руководство по парсингу веб-страниц на Python с использованием Beautiful Soup
Сегодня мы обсудим, как использовать библиотеку Beautiful Soup для извлечения содержимого из HTML-страницы. После извлечения мы преобразуем его в список или словарь Python с помощью Beautiful Soup.
Что такое веб-скрапинг и зачем он мне нужен?
Простой ответ таков: не у каждого веб-сайта есть API для получения контента. Возможно, вы захотите получить рецепты с вашего любимого кулинарного веб-сайта или фотографии из блога о путешествиях. Без API, извлечения HTML или соскребая , может быть единственным способом получить этот контент. Я собираюсь показать вам, как это сделать в Python.
Не все веб-сайты благосклонно относятся к парсингу, а некоторые могут прямо запрещать его. Уточните у владельцев веб-сайтов, согласны ли они со скрейпингом.
Как очистить сайт на Python?
Чтобы веб-скрапинг работал в Python, мы собираемся выполнить три основных шага:
Извлечь HTML-контент с помощью библиотеки запросов .
Проанализируйте структуру HTML и определите теги, содержащие наш контент.
Извлеките теги с помощью Beautiful Soup и поместите данные в список Python.
Установка библиотек
Сначала установим необходимые библиотеки. Библиотека запросов извлекает HTML-контент с веб-сайта. Beautiful Soup анализирует HTML и преобразует его в объекты Python. Чтобы установить их для Python 3, запустите:
pip3 install Requests BeautifulSoup4
Извлечение HTML-кода
В этом примере я выберу очистку раздела Технологии на этом веб-сайте. Если вы перейдете на эту страницу, вы увидите список статей с названием, выдержкой и датой публикации. Наша цель — создать список статей с этой информацией.
Полный URL-адрес страницы технологии:
https://notes.ayushsharma.in/technology
Мы можем получить HTML-контент с этой страницы, используя запросов :
#!/usr/bin/ питон3 import request
url = 'https://notes.ayushsharma.in/technology'
data = request.get(url)
print(data.text)
Переменная data будет содержать HTML исходный код страницы.
Извлечение содержимого из HTML
Чтобы извлечь наши данные из HTML, полученного в data , нам нужно определить, какие теги содержат то, что нам нужно.
Если вы просмотрите HTML-код, вы найдете этот раздел вверху:
3 страница для каждой статьи. Мы видим, что .card-title имеет заголовок статьи, .card-text содержит отрывок, а .card-footer > small имеет дату публикации.
Давайте извлечем их с помощью Beautiful Soup.
#!/usr/bin/python3 запросы на импорт из bs4 import BeautifulSoup из pprint
my_data = []
html = BeautifulSoup(data.text, 'html.parser') article = html.select('a.post-card')
Приведенный выше код извлекает статьи и помещает их в переменную my_data . Я использую pprint для красивой печати вывода, но вы можете пропустить его в своем коде. Сохраните приведенный выше код в файле с именем fetch.py , а затем запустите его, используя:
python3 fetch.py
Если все прошло нормально, вы должны увидеть это:
[{'отрывок': "Недавно я обнаружил, что config. yml Jekyll можно использовать для" "определения пользовательских переменных для повторного использования контента. Мне кажется, что я " " все это время жил под камнем. Но ошибаться снова и снова' 'снова человек.', 'pub_date': 'Август 2021', 'title': 'Использование переменных в Jekyll для определения пользовательского контента'}, {'выдержка': "В В этой статье я расскажу о некоторых идеях для коллекций Jekyll" , страниц категорий блогов, адаптивного веб-дизайна и" 'netlify.toml для облегчения обслуживания статических веб-сайтов.', 'pub_date': 'июль 2021', 'title': 'Эволюция ayushsharma.in: Jekyll, Bootstrap, Netlify,' 'статические веб-сайты, и отзывчивый дизайн.'}, {'выдержка': "Это 5 главных уроков, которые я усвоил за 5 лет" 'Терраформирование.', 'pub_date': 'Июль 2021', 'title ': '5 ключевых рекомендаций для разумных и удобных настроек Terraform'},
... (усечено)
И это все, что нужно! В 22 строках кода мы создали парсер на Python. Вы можете найти исходный код в моем репозитории с примерами.
Заключение
Теперь, когда содержимое веб-сайта находится в списке Python, мы можем делать с ним интересные вещи. Мы могли бы вернуть его как JSON для другого приложения или преобразовать в HTML с пользовательским стилем. Не стесняйтесь копировать и вставлять приведенный выше код и экспериментировать с вашим любимым веб-сайтом.
Получайте удовольствие и продолжайте программировать.
Эта статья была изначально опубликована в личном блоге автора и адаптирована с его разрешения.
Эта работа находится под лицензией Creative Commons Attribution-Share Alike 4.0 International License.
Beautiful Soup — это
Библиотека Python для извлечения данных из файлов HTML и XML. Оно работает
с вашим любимым синтаксическим анализатором, чтобы обеспечить идиоматические способы навигации,
поиск и изменение дерева синтаксического анализа. Это обычно спасает программистов
часов или дней работы.
Эти инструкции иллюстрируют все основные функции Beautiful Soup 4,
с примерами. Я покажу вам, чем хороша библиотека, как она работает,
как его использовать, как заставить его делать то, что вы хотите, и что делать, когда он
нарушает ваши ожидания.
Этот документ относится к Beautiful Soup версии 4.8.1. Примеры в
эта документация должна работать одинаково в Python 2.7 и Python.
3.2.
Возможно, вы ищете документацию для Beautiful Soup 3.
Если это так, вы должны знать, что Beautiful Soup 3 больше не
разработан и что его поддержка будет прекращена в декабре или позже
31, 2020. Если вы хотите узнать о различиях между Beautiful
Soup 3 и Beautiful Soup 4 см. Перенос кода на BS4.
Эта документация была переведена на другие языки
Пользователи Beautiful Soup:
这篇文档当然还有中文版.
このページは日本語で利用できます(外部リンク)
이 문서는 한국어 번역도 가능합니다.
Este documento tambem está disponível em Português do Brasil.
Получение помощи
Если у вас есть вопросы о Beautiful Soup или вы столкнулись с проблемами,
отправить письмо в группу обсуждения. Если
ваша проблема связана с анализом HTML-документа, обязательно упомяните
о чем говорит функция диагностики()
этот документ.
Вот HTML-документ, который я буду использовать в качестве примера на протяжении всего этого
документ. Это часть истории из Алиса в стране чудес :
html_doc = """
История Сони
<тело>
История Сони
Жили-были три сестрички; и их имена были
Элси,
Лейси и
Тилли;
и жили они на дне колодца.
...
"""
Прогон документа «три сестры» через Beautiful Soup дает нам Объект BeautifulSoup , представляющий документ как вложенный
структура данных:
Вот несколько простых способов навигации по этой структуре данных:
суп.название
# История Сони
суп.название.название
# U'название'
суп.название.строка
# u'История Сони'
суп.название.родителя.имя
# у'голова
суп.п
#
История Сони
суп.p['класс']
# U'название'
суп.а
# Элси
суп.найти_все('а')
# [Элси,
# Лейси,
# Тилли]
суп. найти (id = "ссылка3")
# com/tillie">Тилли
Одной из распространенных задач является извлечение всех URL-адресов, найденных в тегах страницы:
для ссылки в sup.find_all('a'):
печать (ссылка. получить ('href'))
# http://example.com/элси
# http://example.com/lacie
# http://example.com/tillie
Другой распространенной задачей является извлечение всего текста со страницы:
print(soup.get_text())
# История Сони
#
# История Сони
#
# Жили-были три сестрички; и их имена были
# Элси,
# Лейси и
# Тилли;
# и они жили на дне колодца.
#
# ...
Похоже, это то, что вам нужно? Если это так, читайте дальше.
Если вы используете последнюю версию Debian или Ubuntu Linux, вы можете
установить Beautiful Soup с помощью системного менеджера пакетов:
$ apt-get install python-bs4 (для Python 2)
$ apt-get install python3-bs4 (для Python 3)
Beautiful Soup 4 опубликован через PyPi, поэтому, если вы не можете установить его
с помощью системного упаковщика вы можете установить его с помощью easy_install или пункт . Имя пакета beautifulsoup4 , и тот же пакет
работает на Python 2 и Python 3. Убедитесь, что вы используете правильную версию pip или easy_install для вашей версии Python (они могут называться pip3 и easy_install3 соответственно, если вы используете Python 3).
$ easy_install BeautifulSoup4
$ pip install BeautifulSoup4
(Пакет BeautifulSoup , вероятно, , а не , что вы хотите. Это
предыдущий основной выпуск, Beautiful Soup 3. Много программ используется
BS3, так что он по-прежнему доступен, но если вы пишете новый код, вам
следует установить beautifulsoup4 .)
Если у вас не установлены easy_install или pip , вы можете
загрузите архив с исходным кодом Beautiful Soup 4 и
установите его с помощью setup.py .
$ python setup.py install
Если ничего не помогает, лицензия Beautiful Soup позволяет
упакуйте всю библиотеку вместе с вашим приложением. Вы можете скачать
tarball, скопируйте его bs4 в кодовую базу вашего приложения,
и используйте Beautiful Soup, вообще не устанавливая его.
Я использую Python 2.7 и Python 3.2 для разработки Beautiful Soup, но это
должен работать с другими последними версиями.
Проблемы после установки
Beautiful Soup упакован как код Python 2. Когда вы устанавливаете его для
использовать с Python 3, он автоматически преобразуется в код Python 3. Если
вы не устанавливаете пакет, код не будет конвертирован. Там есть
также были сообщения о компьютерах с Windows неправильной версии.
установлены.
Если вы получаете ImportError «Нет модуля с именем HTMLParser», ваш
проблема в том, что вы используете версию кода Python 2 под
Python 3.
Если вы получаете ImportError «Нет модуля с именем html.parser», ваш
проблема в том, что вы используете версию кода Python 3 под
Python 2.
В обоих случаях лучше всего полностью удалить Beautiful
Установка Soup из вашей системы (включая любой каталог, созданный
после распаковки архива) и повторите попытку установки.
Если вы получаете SyntaxError «Неверный синтаксис» в строке ROOT_TAG_NAME = u'[document]' , вам нужно преобразовать Python 2
код на Python 3. Это можно сделать либо путем установки пакета:
$ python3 setup.py install
, либо вручную запустив скрипт преобразования Python 2to3 на bs4 каталог:
$ 2to3-3.2 -w bs4
Установка синтаксического анализатора
Beautiful Soup поддерживает синтаксический анализатор HTML, включенный в стандарт Python
библиотека, но она также поддерживает ряд сторонних парсеров Python.
Одним из них является парсер lxml. В зависимости от вашей настройки,
вы можете установить lxml с помощью одной из этих команд:
$ apt-get install python-lxml
$ easy_install lxml
$ pip install lxml
веб-браузер делает. В зависимости от вашей настройки вы можете установить html5lib
с помощью одной из следующих команд:
$ apt-get install python-html5lib
$ easy_install html5lib
$ pip install html5lib
В этой таблице приведены преимущества и недостатки каждой библиотеки анализаторов:
Типичное использование
Преимущества
Недостатки
html. parser Python
BeautifulSoup(разметка, "html.parser")
Батарейки в комплекте
Достойная скорость
Снисходительный (начиная с Python 2.7.3
и 3.2.)
Не так быстро, как lxml,
менее снисходителен, чем
html5lib.
Единственный в настоящее время поддерживаемый
Анализатор XML
Внешняя зависимость C
html5lib
BeautifulSoup(разметка, "html5lib")
Чрезвычайно мягкий
Разбирает страницы так же, как
веб-браузер делает
Создает действительный HTML5
Очень медленно
Внешний питон
зависимость
Если вы можете, я рекомендую вам установить и использовать lxml для ускорения. Если ты
используя версию Python 2, предшествующую 2.7.3, или версию Python
3 раньше, чем 3.2.2, важно установить lxml или
html5lib — встроенный в Python парсер HTML просто не очень хорош в старых версиях.
версии.
Обратите внимание, что если документ недействителен, разные парсеры будут генерировать
различные деревья Beautiful Soup для него. См. Различия
между парсерами для деталей.
Чтобы проанализировать документ, передайте его в BeautifulSoup конструктор. Вы можете передать строку или дескриптор открытого файла:
из bs4 import BeautifulSoup
с open("index.html") как fp:
суп = BeautifulSoup(fp)
суп = BeautifulSoup("данные")
Сначала документ преобразуется в Unicode, а объекты HTML
преобразовано в символы Unicode:
BeautifulSoup("Sacré bleu!")
Голубой святой!
Beautiful Soup затем анализирует документ, используя наилучшие доступные
парсер. Он будет использовать синтаксический анализатор HTML, если вы специально не укажете ему
использовать анализатор XML. (См. Разбор XML.)
Beautiful Soup преобразует сложный HTML-документ в сложное дерево.
объектов Python. Но вам придется иметь дело только с четырьмя видов объектов: Тег , NavigableString , BeautifulSoup ,
и Комментарий .
Бирка
Объект Тег соответствует тегу XML или HTML в исходном документе:
Теги имеют множество атрибутов и методов, и я расскажу о большинстве из них.
в Навигация по дереву и Поиск по дереву. На данный момент наиболее
важными характеристиками тега являются его имя и атрибуты.
Имя
Каждый тег имеет имя, доступное как .имя :
тэг.имя
# у'б'
Если вы измените имя тега, это изменение будет отражено в любом HTML-коде. разметка, сгенерированная Beautiful Soup:
tag.name = "blockquote"
ярлык
#
Очень жирный шрифт
Атрибуты
Тег может иметь любое количество атрибутов. Тег имеет атрибут "id", значение которого
«самый смелый». Вы можете получить доступ к атрибутам тега, рассматривая тег как
словарь:
тег['id']
# ты самый смелый
Вы можете получить доступ к этому словарю напрямую как .attrs :
tag.attrs
# {u'id': 'самый смелый'}
Вы можете добавлять, удалять и изменять атрибуты тега. Опять же, это
делается путем обработки тега как словаря:
tag['id'] = 'verybold'
тег['другой-атрибут'] = 1
ярлык
#
тег ['id']
del tag['другой-атрибут']
ярлык
#
тег['id']
# KeyError: 'идентификатор'
печать (тег. получить ('идентификатор'))
# Никто
Многозначные атрибуты
HTML 4 определяет несколько атрибутов, которые могут иметь несколько значений. HTML 5
удаляет пару из них, но определяет еще несколько. Самый распространенный
многозначный атрибут class (то есть тег может иметь более
один класс CSS). Другие включают rel , rev , accept-charset , заголовки и ключ доступа . Beautiful Soup представляет ценность (и)
многозначного атрибута в виде списка:
Если атрибут выглядит так, как будто он имеет более одного значения, но не
многозначный атрибут, определенный любой версией HTML
стандарт, Beautiful Soup оставит этот атрибут в покое:
Вы можете использовать `get_attribute_list , чтобы получить значение, которое всегда
список, независимо от того, является ли он многозначным атрибутом:
id_soup.p.get_attribute_list('id')
# ["мой ID"]
При анализе документа как XML многозначные атрибуты отсутствуют:
Возможно, вам не понадобится это делать, но если вы это сделаете, используйте значения по умолчанию, как
Руководство. Они реализуют правила, описанные в спецификации HTML:
из bs4.builder import builder_registry
builder_registry.lookup('html').DEFAULT_CDATA_LIST_ATTRIBUTES
Навигационная строка
Строка соответствует фрагменту текста внутри тега. Красивый суп
использует класс NavigableString , чтобы содержать следующие биты текста:
A NavigableString аналогична строке Python Unicode, за исключением
что он также поддерживает некоторые функции, описанные в разделе Навигация.
дерево и поиск дерева. Вы можете преобразовать NavigableString в строку Unicode с unicode() :
Вы не можете редактировать строку на месте, но можете заменить одну строку на
другой, используя replace_with():
tag. string.replace_with("Больше не полужирный")
ярлык
#
Больше не жирный шрифт
NavigableString поддерживает большинство функций, описанных в
Навигация по дереву и поиск по дереву, но не все
их. В частности, поскольку строка не может ничего содержать (как
тег может содержать строку или другой тег), строки не поддерживают .contents или .string атрибуты или метод find() .
Если вы хотите использовать NavigableString вне Beautiful Soup,
вы должны вызвать unicode() , чтобы превратить его в обычный Python
Строка Юникода. Если вы этого не сделаете, ваша строка будет носить
ссылка на все дерево синтаксического анализа Beautiful Soup, даже если вы
сделано с помощью Beautiful Soup. Это большая трата памяти.
Красивый суп
Объект BeautifulSoup представляет проанализированный документ как
весь. В большинстве случаев вы можете рассматривать его как тег
объект. Это означает, что он поддерживает большинство методов, описанных в
Навигация по дереву и поиск по дереву.
Вы также можете передать объект BeautifulSoup в один из методов
определено в разделе «Изменение дерева», точно так же, как и тег. Этот
позволяет вам делать такие вещи, как объединение двух проанализированных документов:
doc = BeautifulSoup("INSERT FOOTER HEREВот нижний колонтитул", "xml")
doc.find(text="ВСТАВЬТЕ НИЖНИЙ ФУТЕР ЗДЕСЬ").replace_with(нижний колонтитул)
# u'ВСТАВЬТЕ НИЖНИЙ ФУТЕР ЗДЕСЬ'
распечатать (документ)
#
#
Поскольку объект BeautifulSoup не соответствует фактическому
Тег HTML или XML, у него нет ни имени, ни атрибутов. Но иногда это
полезно взглянуть на его .name , так что ему было присвоено специальное . имя «[документ]»:
суп.название
# u'[документ]'
Вот снова HTML-документ «Три сестры»:
html_doc = """
История Сони
<тело>
История Сони
Жили-были три сестрички; и их имена были
Элси,
Лейси и
Тилли;
и жили они на дне колодца.
...
"""
из bs4 импортировать BeautifulSoup
суп = BeautifulSoup(html_doc, 'html.parser')
Я буду использовать это в качестве примера, чтобы показать вам, как перейти от одной части
документа к другому.
Вниз
Теги могут содержать строки и другие теги. Эти элементы являются тегом детей . Beautiful Soup предоставляет множество различных атрибутов для
навигация и перебор дочерних элементов тега.
Обратите внимание, что строки Beautiful Soup не поддерживают ни один из этих
атрибуты, потому что у строки не может быть дочерних элементов.
Навигация с использованием имен тегов
Самый простой способ навигации по дереву синтаксического анализа — произнести имя
тег, который вы хотите. Если вам нужен тег
, просто скажите суп.голова :
суп.голова
# История Сони
суп.название
# История Сони
Вы можете использовать этот трюк снова и снова, чтобы увеличить определенную часть
дерева синтаксического анализа. Этот код получает первый тег под тегом:
суп.тело.b
# История Сони
Использование имени тега в качестве атрибута даст вам только первый тег по этому
название:
Строка не имеет .contents , потому что она не может содержать
что угодно:
текст = title_tag.contents[0]
text.contents
# AttributeError: объект 'NavigableString' не имеет атрибута 'contents'
Вместо того, чтобы получать их в виде списка, вы можете перебирать теги
дети используют . children генератор:
для дочернего элемента в title_tag.children:
печать (ребенок)
# История Сони
.descendants
Атрибуты .contents и .children учитывают только теги прямых детей. Например, тег
имеет один прямой
дочерний элемент — тег:
head_tag.contents
# [История Сони]
Но у самого тега
есть дочерний элемент: строка «The Donmouse’s
история". В некотором смысле эта строка также является потомком
тег. Атрибут .descendants позволяет перебирать все дочерних элементов тега, рекурсивно: его непосредственные дочерние элементы, дочерние элементы
его прямые дочерние элементы и т. д.:
для дочернего элемента в head_tag.descendants:
печать (ребенок)
# История Сони
# История Сони
Тег
имеет только одного потомка, но двух потомков:
Тег и дочерний элемент тега. Объект BeautifulSoup имеет только одного прямого потомка (тег), но имеет много
потомки:
лен(список(суп.дети))
№ 1
len (список (суп.потомки))
№ 25
.string
Если у тега есть только один дочерний элемент, и этот дочерний элемент является NavigableString ,
дочерний элемент доступен как .string :
title_tag.string
# u'История Сони'
Если единственным дочерним элементом тега является другой тег, и этот тег имеет .string , тогда считается, что родительский тег имеет такой же .string как его дочерний элемент:
Если тег содержит более одной вещи, то непонятно, что .string должен ссылаться, поэтому .string определяется как Нет :
print(soup.html.string)
# Никто
. strings и stripped_strings
только струны. Используйте .strings генератор:
для строки в супе.строки:
печать (представление (строка))
# u"История Сони"
# u'\n\n'
# u"История Сони"
# u'\n\n'
# u'Жили-были три сестрички; и их имена были\n'
# ты Элси
# u',\n'
# ты Лейси
# и' и\n'
# у'Тилли'
# u';\nи жили они на дне колодца.'
# u'\n\n'
# ты...'
# п'\п'
В этих строках обычно много лишних пробелов, которые вы можете
удалить с помощью .stripped_strings 9Генератор 0108 вместо:
для строки в супе.stripped_strings:
печать (представление (строка))
# u"История Сони"
# u"История Сони"
# u'Жили-были три сестрички; и их имена были'
# ты Элси
# у','
# ты Лейси
# и'и'
# у'Тилли'
# u';\nи жили они на дне колодца.'
# ты...'
Здесь игнорируются строки, полностью состоящие из пробелов, и
пробелы в начале и конце строк удаляются.
Вверх
Продолжая аналогию с «генеалогическим древом», каждый тег и каждая строка имеют parent : содержащий его тег.
.parent
Вы можете получить доступ к родителю элемента с помощью атрибута .parent . В
пример документа «три сестры», тег
является родительским
тега:
title_tag = суп.название
title_tag
# История Сони
title_tag.parent
# История Сони
Сама строка заголовка имеет родителя: тег
, содержащий
это:
title_tag.string.parent
# История Сони
Родителем тега верхнего уровня, такого как, является объект BeautifulSoup сам:
html_tag = суп.html
тип (html_tag.parent)
# <класс 'bs4.BeautifulSoup'>
И .parent объекта BeautifulSoup определяется как None:
ссылка = суп. а
ссылка на сайт
# Элси
для родителя в link.parents:
если родитель None:
печать (родительский)
еще:
печать (родитель.имя)
# п
# тело
# html
# [документ]
# Никто
Тег и тег находятся на одном уровне: они оба прямые
дети одного тега. Мы называем их братьев и сестер . Когда документ
красиво напечатаны, братья и сестры отображаются на одном уровне отступа. Ты
также можете использовать эту связь в коде, который вы пишете.
.next_sibling и .previous_sibling
Вы можете использовать .next_sibling и .previous_sibling для навигации
между элементами страницы, которые находятся на одном уровне дерева разбора:
В теге есть .next_sibling , но нет .previous_sibling ,
потому что перед тегом на том же уровне
дерево . По той же причине тег имеет .previous_sibling но нет .next_sibling :
print(sibling_soup.b.previous_sibling)
# Никто
печать (sibling_soup.c.next_sibling)
# Никто
Строки «текст1» и «текст2» являются , а не одноуровневыми, потому что они не
иметь одного родителя:
sibling_soup.b.string
# у'текст1'
печать (sibling_soup.b.string.next_sibling)
# Никто
В реальных документах .next_sibling или .previous_sibling тег обычно представляет собой строку, содержащую пробелы. Возвращаясь к
Документ «три сестры»:
Вы можете перебрать одноуровневых элементов тега с помощью .previous_siblings :
для брата в супе.а.next_siblings:
печать (репр (родной брат))
# u',\n'
# Лейси
# и' и\n'
# Тилли
# у'; и жили они на дне колодца».
# Никто
для родного брата в супе.find(id="link3").previous_siblings:
печать (репр (родной брат))
# ' и н'
# Лейси
# u',\n'
# com/elsie">Элси
# u'Жили-были три сестрички; и их имена были\n'
# Никто
Взад и вперед
Взгляните на начало документа «Три сестры»:
История Сони
История Сони
Анализатор HTML берет эту строку символов и превращает ее в
серии событий: «открыть тег», «открыть тег
тег» и так далее. Beautiful Soup предлагает инструменты для реконструкции
первичный разбор документа.
.next_element и .previous_element
Атрибут .next_element строки или тега указывает на что-либо
был разобран сразу после этого. Это может быть то же самое, что и .next_sibling , но обычно это сильно отличается.
Атрибут .previous_element является полной противоположностью .следующий_элемент . Он указывает на любой элемент, который был проанализирован
непосредственно перед этим:
Вы уже должны уловить идею. Вы можете использовать эти итераторы для перемещения
вперед или назад в документе по мере его анализа:
для элемента в last_a_tag.next_elements:
печать (представление (элемент))
# у'Тилли'
# u';\nи жили они на дне колодца.'
# u'\n\n'
#
...
# ты...'
# п'\п'
# Никто
Beautiful Soup определяет множество методов поиска по дереву синтаксического анализа,
но они все очень похожи. Я собираюсь потратить много времени на объяснение
два самых популярных метода: find() и find_all() . Другой
методы принимают почти одни и те же аргументы, поэтому я просто расскажу
их кратко.
Еще раз, я буду использовать документ «три сестры» в качестве примера:
html_doc = """
История Сони
<тело>
История Сони
Жили-были три сестрички; и их имена были
com/elsie">Элси,
Лейси и
Тилли;
и жили они на дне колодца.
...
"""
из bs4 импортировать BeautifulSoup
суп = BeautifulSoup(html_doc, 'html.parser')
Передав фильтр аргументу вроде find_all() , вы можете
увеличьте интересующие вас части документа.
Виды фильтров
хотите показать примеры различных фильтров, которые вы можете передать в эти
методы. Эти фильтры появляются снова и снова на протяжении всего
поисковый API. Вы можете использовать их для фильтрации по имени тега,
на его атрибутах, на тексте строки или на некоторой комбинации
эти.
Строка
Простейшим фильтром является строка. Передайте строку методу поиска и
Beautiful Soup выполнит сопоставление именно с этой строкой. Этот
код находит все теги в документе:
soap.find_all('b')
# [История Сони]
Если вы передаете строку байтов, Beautiful Soup будет считать, что строка
кодируется как UTF-8. Вы можете избежать этого, передав вместо этого строку Unicode.
Регулярное выражение
9б")):
печать (тег.имя)
# тело
# б
Этот код находит все теги, имена которых содержат букву «t»:
для тега в супе.find_all(re.compile("t")):
печать (тег.имя)
# html
# заглавие
Список
Если вы передадите список, Beautiful Soup разрешит совпадение строки
против любого элемента в этом списке. Этот код находит все теги и все теги :
Значение True соответствует всему, что возможно. Этот код находит все теги в документе, но ни одна из текстовых строк:
для тега в супе.find_all(True):
печать (тег.имя)
# html
# глава
# заглавие
# тело
# п
# б
# п
# а
# а
# а
# п
Функция
Если ни одно из других совпадений вам не подходит, определите функцию, которая
принимает элемент в качестве единственного аргумента. Функция должна вернуть Истинно , если аргумент совпадает, и Ложь иначе.
Вот функция, которая возвращает True , если тег определяет «класс»
атрибут, но не определяет атрибут «id»:
def has_class_but_no_id(tag):
вернуть tag.has_attr('класс'), а не tag.has_attr('id')
Передайте эту функцию в find_all() и вы получите все
Если вы передаете функцию для фильтрации по определенному атрибуту, например href , аргумент, переданный в функцию, будет атрибутом
значение, а не весь тег. Вот функция, которая находит все теги и чей href атрибут не соответствует регулярному выражению:
def not_lacie(href):
вернуть href, а не перекомпилировать ("lacie"). поиск (href)
суп.найти_все(href=not_lacie)
# [Элси,
# Тилли]
Функция может быть настолько сложной, насколько вам нужно. Вот
функция, которая возвращает True , если тег окружен строкой
объекты:
из bs4 import NavigableString
def окруженный_by_strings(тег):
return (isinstance(tag.next_element, NavigableString)
и isinstance(tag.previous_element, NavigableString))
для тега в soap.find_all(surrounded_by_strings):
распечатать имя тега
# п
# а
# а
# а
# п
Теперь мы готовы подробно рассмотреть методы поиска.
Метод find_all() просматривает потомков тега и
извлекает всех потомков, которые соответствуют вашим фильтрам. я дал несколько
примеры в разделе Виды фильтров, но вот еще несколько:
]
суп.найти_все ("а")
# [Элси,
# Лейси,
# Тилли]
суп.найти_все (id = "ссылка2")
# [Лейси]
импортировать повторно
суп.найти(строка=перекомпилировать("сестры"))
# u'Жили-были три сестрички; и их имена были\n'
Некоторые из них должны выглядеть знакомыми, а другие — новыми. Что это делает
значит передать значение для строки или id ? Почему find_all("p", "title") найти тег
с CSS-классом title?
Давайте посмотрим на аргументы find_all() .
Имя
Аргумент
Введите значение для имени , и вы скажете Beautiful Soup только
рассмотреть теги с определенными именами. Текстовые строки будут игнорироваться, т.к.
будут теги, имена которых не совпадают.
Это самое простое использование:
суп.найти_все("название")
# [История Сони]
Напомним из Виды фильтров, что значение имя может быть
строка, регулярное выражение, список, функция или значение
Истинный.
Аргументы ключевого слова
Любой аргумент, который не распознан, будет преобразован в фильтр на одном
атрибутов тега. Если вы передаете значение для аргумента с именем id ,
Beautiful Soup будет фильтровать по атрибуту «id» каждого тега:
Вы не можете использовать аргумент ключевого слова для поиска элемента «имя» HTML,
потому что Beautiful Soup использует аргумент имя , чтобы содержать имя
самого тега. Вместо этого вы можете указать значение «имя» в attrs аргумент:
Очень удобно искать тег с определенным классом CSS, но
имя атрибута CSS, «класс», является зарезервированным словом в
Питон. Использование class в качестве аргумента ключевого слова даст вам синтаксис
ошибка. Начиная с Beautiful Soup 4.1.2, вы можете искать по классу CSS, используя
аргумент ключевого слова class_ :
]
защита has_six_characters (css_class):
вернуть css_class не None и len(css_class) == 6
суп.найти_все (класс_ = имеет_шесть_символов)
# [Элси,
# Лейси,
# Тилли]
Помните, что у одного тега может быть несколько
значения для его атрибута «класс». Когда вы ищете тег, который
соответствует определенному классу CSS, вы сопоставляете любые своего CSS
классы:
Если вы хотите найти теги, соответствующие двум или более классам CSS, вам
следует использовать селектор CSS:
css_soup. select("p.strikeout.body")
# []
В старых версиях Beautiful Soup, в которых нет класса _ ярлык, вы можете использовать трюк attrs , упомянутый выше. Создать
словарь, значением которого для «класса» является строка (или обычный
выражение или что-то еще), которое вы хотите найти:
С помощью строки вы можете искать строки вместо тегов. Как с имя и аргументы ключевого слова, вы можете передать в строке,
регулярное выражение, список, функция или значение True.
Вот несколько примеров:
soap.find_all(string="Элси")
# [у'Элси']
суп.найти_все (строка = ["Тилли", "Элси", "Лейси"])
# [у'Элси', у'Лейси', у'Тилли']
суп.найти_все (строка = перекомпилировать ("Соня"))
[u"История Сони", u"История Сони"]
def is_the_only_string_within_a_tag(s):
"""Возвращает True, если эта строка является единственным дочерним элементом своего родительского тега. """
возврат (s == s.parent.string)
суп.найти_все (строка = is_the_only_string_within_a_tag)
# [u"История Сони", u"История Сони", u'Элси', u'Лейси', u'Тилли', u'...']
Хотя строка предназначена для поиска строк, вы можете комбинировать ее с
аргументы, которые находят теги: Beautiful Soup найдет все теги, .string соответствует вашему значению для string . Этот код находит теги, у которых .string — «Элси»:
find_all() возвращает все теги и строки, соответствующие вашему
фильтры. Это может занять некоторое время, если документ большой. Если вы не
нужно все результаты, вы можете передать число для ограничение . Этот
работает так же, как ключевое слово LIMIT в SQL. Он сообщает Beautiful Soup
прекратить сбор результатов после того, как будет найдено определенное число.
В документе «три сестры» есть три ссылки, но этот код
находит только первые два:
Если вы вызовете mytag.find_all() , Beautiful Soup проверит все
потомки mytag : его дочерние, его дочерние дочерние и
скоро. Если вы хотите, чтобы Beautiful Soup учитывал только прямых детей,
вы можете пройти через рекурсивный=ложь . Посмотрите разницу здесь:
<голова>
<название>
История Сони
название>
голова>
...
Тег
находится под тегом, но не напрямую под тегом: мешает тег. Красивый суп
находит тег, когда разрешен просмотр всех потомков
тег, но когда recursive=False ограничивает его
непосредственных дочерних элементов тега, он ничего не находит.
Beautiful Soup предлагает множество методов поиска по дереву (описанных ниже),
и они в основном принимают те же аргументы, что и find_all() : name , attrs , string , limit и аргументы ключевого слова. Но рекурсивный аргумент отличается: find_all() и find() единственные методы, которые его поддерживают. Прохождение рекурсивный = Ложь в
такой метод, как find_parents() , не был бы очень полезен.
Вызов тега аналогичен вызову
find_all()
Потому что find_all() — самый популярный метод в Beautiful
API поиска супа, вы можете использовать для него ярлык. Если вы относитесь к объект BeautifulSoup или объект Tag , как будто это
функция, то это то же самое, что и вызов find_all() для этого
объект. Эти две строки кода эквивалентны:
Метод find_all() сканирует весь документ в поисках
результаты, но иногда вы хотите найти только один результат. Если вы знаете
документ имеет только один тег
, пустая трата времени на сканирование
весь документ ищет больше. Вместо прохождения лимит=1 каждый раз, когда вы вызываете find_all , вы можете использовать find() метод. Эти две строки кода почти эквивалентны :
soap.find_all('title', limit=1)
# [История Сони]
суп. найти('название')
# История Сони
Единственное отличие состоит в том, что find_all() возвращает список, содержащий
единственный результат, а find() просто возвращает результат.
Если find_all() ничего не может найти, возвращается пустой список. Если find() ничего не может найти, возвращает None :
print(soup.find("nosuchtag"))
# Никто
Помните трюк soap.head.title из Навигация с использованием тега
имена? Этот трюк работает при повторном вызове find() :
sup.head.title
# История Сони
суп.найти("голова").найти("название")
# История Сони
find_all() и найти() . Beautiful Soup API определяет десять других методов для
ищите дерево, но не бойтесь. Пять из этих методов
в основном то же самое, что и find_all() , а остальные пять в основном
то же, что найти() . Различия только в том, какие части
дерево они ищут.
Сначала рассмотрим find_parents() и find_parent() . Помните, что find_all() и find() работают
спускаются по дереву, глядя на потомков тега. Эти методы
делают наоборот: они прокладывают себе путь вверх по дереву, глядя на теги
(или строки) родителей. Давайте попробуем их, начиная со строки
похоронен глубоко в документе «трех дочерей»:
Signature: find_previous_sibling(name, at**trs, string) методы используют .previous_siblings для перебора элементов
братьев и сестер, которые предшествуют ему в дереве. find_previous_siblings() метод возвращает всех совпадающих братьев и сестер, и find_previous_sibling() возвращает только первый:
Эти методы используют .next_elements для
перебирать любые теги и строки, которые идут после него в
документ. Метод find_all_next() возвращает все совпадения и find_next() возвращает только первое совпадение:
first_link = суп.а
первая_ссылка
# Элси
first_link.find_all_next (строка = Истина)
# [u'Элси', u',\n', u'Лейси', u' и\n', u'Тилли',
# u';\nи жили они на дне колодца. ', u'\n\n', u'...', u'\n']
first_link.find_next("p")
#
Эти методы используют .previous_elements для
перебирать теги и строки, которые были до него в
документ. Метод find_all_previous() возвращает все совпадения и find_previous() возвращает только первое совпадение:
Начиная с версии 4.7.0 Beautiful Soup поддерживает большинство селекторов CSS4 через
СупСито
проект. Если вы установили Beautiful Soup через pip , SoupSieve
был установлен в то же время, поэтому вам не нужно делать ничего дополнительно.
BeautifulSoup имеет метод .select() , который использует SoupSieve для
запустите селектор CSS для проанализированного документа и верните все
совпадающие элементы. Тег имеет аналогичный метод, который запускает CSS
селектор против содержимого одного тега.
(в более ранних версиях Beautiful Soup также есть .select() метод, но поддерживаются только наиболее часто используемые селекторы CSS.)
В документации SoupSieve перечислены все текущие
поддерживаются селекторы CSS, но вот некоторые из основ:
Если вы проанализировали XML, определяющий пространства имен, вы можете использовать их в CSS
селекторы. :
из импорта bs4 BeautifulSoup
xml = """<тег xmlns:ns1="http://namespace1/" xmlns:ns2="http://namespace2/">
Я нахожусь в пространстве имен 1Я нахожусь в пространстве имен 2
тег> """
суп = BeautifulSoup(xml, "xml")
суп.выбрать("ребенок")
# [Я в пространстве имен 1, Я в пространстве имен 2]
суп.выбрать("ns1|ребенок", namespaces=namespaces)
# [Я нахожусь в пространстве имен 1]
При обработке селектора CSS, использующего пространства имен, Beautiful Soup
использует аббревиатуры пространств имен, найденные при анализе
документ. Вы можете переопределить это, передав свой собственный словарь
сокращения:
пространств имен = dict(first="http://namespace1/", second="http://namespace2/")
суп.выбрать("второй|дочерний", namespaces=namespaces)
# [Я нахожусь в пространстве имен 2]
Все эти CSS-селекторы удобны для тех, кто уже
знать синтаксис селектора CSS. Все это можно сделать с помощью
API красивого супа. И если селекторы CSS — это все, что вам нужно, вы должны
разобрать документ с помощью lxml: это намного быстрее. Но это позволяет вам объединяет селектора CSS с API Beautiful Soup.
Основная сила Beautiful Soup заключается в поиске по дереву синтаксического анализа, но вы
также можете изменить дерево и записать свои изменения в виде нового HTML или XML
документ.
Изменение имен тегов и атрибутов
Я рассказывал об этом ранее, в разделе Атрибуты, но стоит повторить. Ты
может переименовывать тег, изменять значения его атрибутов, добавлять новые
атрибуты и атрибуты удаления:
Если вам нужно добавить строку в документ, нет проблем — вы можете передать
Строка Python до append() , или вы можете вызвать NavigableString конструктор:
Tag.insert() аналогичен Tag.append() , за исключением нового элемента
не обязательно идет в конце родительского .содержимое . Он будет вставлен в любую числовую позицию, которую вы
сказать. Он работает так же, как .insert() в списке Python:
PageElement.replace_with() удаляет тег или строку из дерева,
и заменяет его тегом или строкой по вашему выбору:
markup = 'Я связан с example.com'
суп = BeautifulSoup(разметка)
a_tag = суп.а
новый_тег = суп.новый_тег ("б")
new_tag.string = "example.net"
a_tag.i.replace_with (новый_тег)
a_tag
# com/">Я связался с example.net
replace_with() возвращает тег или строку, которая была заменена, поэтому
что вы можете изучить его или добавить обратно в другую часть дерева.
wrap()
PageElement.wrap() заключает элемент в указанный вами тег. Это
возвращает новую оболочку:
суп = BeautifulSoup("
Хотел бы я быть смелым.
")
суп.p.string.wrap(soup.new_tag("b"))
# Хотел бы я быть смелым.
суп.p.wrap(soup.new_tag("div")
#
Хотел бы я быть смелым.
Этот метод появился в Beautiful Soup 4.0.5.
развернуть()
Tag.unwrap() является противоположностью wrap() . Он заменяет тег на
все, что находится внутри этого тега. Это удобно для удаления разметки:
markup = 'Я сделал ссылку на example.com'
суп = BeautifulSoup(разметка)
a_tag = суп.а
a_tag.i.unwrap()
a_tag
# com/">Я сделал ссылку на example.com
Как replace_with() , unwrap() возвращает тег
что заменили.
smooth()
После вызова нескольких методов, изменяющих дерево синтаксического анализа, вы можете получить два или более объекта NavigableString рядом друг с другом. У Beautiful Soup с этим проблем нет, но, поскольку это невозможно в только что проанализированном документе, можно не ожидать следующего поведения: )
суп.п.добавить(", двойка")
суп.п.содержимое
# [u'A one', u', a two']
печать (суп.p.encode())
#
Раз, два
печать (суп.p.prettify())
# <р> # Один
# , двойка
#
Вы можете вызвать Tag.smooth() для очистки дерева синтаксического анализа путем объединения соседних строк:
суп.smooth()
суп.п.содержимое
# [u'A один, два']
печать (суп.p.prettify())
# <р>
# Раз, два
#
Метод smooth() появился в Beautiful Soup 4.8.0.
Pretty-printing
Метод prettify() превратит дерево синтаксического анализа Beautiful Soup в
красиво отформатированная строка Unicode, с отдельной строкой для каждой
тег и каждая строка:
Функция str() возвращает строку в кодировке UTF-8. Видеть
Кодировки для других опций.
Вы также можете вызвать encode() , чтобы получить строку байтов, и декодировать() чтобы получить Юникод.
Средства форматирования вывода
Если вы предоставите Beautiful Soup документ, содержащий объекты HTML, такие как
«&lquot;», они будут преобразованы в символы Юникода:
суп = BeautifulSoup("“Черт возьми!” сказал он.")
юникод (суп)
# u'\u201cЧерт возьми!\u201d он сказал.'
Если затем преобразовать документ в строку, символы Unicode
будет закодирован как UTF-8. Вы не вернете HTML-сущности:
ул(суп)
# '\xe2\x80\x9cЧерт возьми!\xe2\x80\x9d сказал он.'
По умолчанию единственные символы, которые экранируются при выводе, пусты. Амперсанды и угловые скобки. Они превращаются в «&», «<»,
и «>», чтобы Beautiful Soup случайно не сгенерировал
неверный HTML или XML:
Вы можете изменить это поведение, указав значение для форматер аргумент для prettify() , encode() , или декодировать() . Beautiful Soup распознает пять возможных значений для форматер .
По умолчанию formatter="minimal" . Строки будут обрабатываться только
достаточно, чтобы убедиться, что Beautiful Soup генерирует правильный HTML/XML:
french = "
Il a dit <<Sacré bleu!>>
"
суп = BeautifulSoup (французский)
печать (soup. prettify (formatter = "минимальный"))
#
# <тело>
# <р>
# Il a dit <<Sacré bleu!>>
#
# тело>
#
Если вы передадите formatter="html" , Beautiful Soup преобразует
Символы Юникода в объекты HTML, когда это возможно:
print(soup.prettify(formatter="html"))
#
# <тело>
# <р>
# Il a dit <<Sacré блю!>>
#
# тело>
#
Если вы передадите formatter="html5" , это то же самое, что formatter="html5" , но Beautiful Soup
опустите закрывающую косую черту в HTML-тегах void, таких как «br»:
Если вы передадите formatter=None , Beautiful Soup не будет изменен
строки вообще на выходе. Это самый быстрый вариант, но он может привести
на Beautiful Soup, создающий недопустимый HTML/XML, как в этих примерах:
print(soup. prettify(formatter=None))
#
# <тело>
# <р>
# Il a dit <>
#
# тело>
#
link_soup = BeautifulSoup('Ссылка')
печать (link_soup.a.encode (formatter = None))
# Ссылка
Если вам нужен более сложный контроль над вашим выходом, вы можете
используйте класс Formatter от Beautiful Soup. Вот форматтер, который
преобразует строки в верхний регистр, независимо от того, встречаются ли они в текстовом узле или в
значение атрибута:
из bs4.formatter import HTMLFormatter
заглавная буква (ул):
вернуть ул.верхний()
форматтер = HTMLFormatter (верхний регистр)
печать (soup.prettify (форматтер = форматтер))
#
# <тело>
# <р>
# IL A DIT <>
#
# тело>
#
print(link_soup.a.prettify(formatter=formatter))
#
# ССЫЛКА
# а>
Подклассы HTMLFormatter или XMLFormatter дадут вам даже
больше контроля над выводом. Например, Beautiful Soup сортирует
атрибуты в каждом теге по умолчанию:
Чтобы отключить это, вы можете создать подкласс Formatter.attributes() метод, который контролирует, какие атрибуты выводятся и в каком
заказ. Эта реализация также отфильтровывает атрибут с именем «m».
всякий раз, когда он появляется:
класс UnsortedAttributes (HTMLFormatter):
Атрибуты определения (я, тег):
для k, v в tag.attrs.items():
если к == 'м':
Продолжать
выход k, v
print(attr_soup.p.encode(formatter=UnsortedAttributes()))
#
Последнее предостережение: если вы создаете объект CData , текст внутри
этот объект всегда представляется точно таким, каким он выглядит, без
форматирование . Beautiful Soup вызовет замену вашей сущности
на тот случай, если вы написали пользовательскую функцию, которая
все строки в документе или что-то в этом роде, но он будет игнорировать
возвращаемое значение:
Если вам нужна только текстовая часть документа или тега, вы можете использовать метод get_text() . Он возвращает весь текст в документе или
под тегом в виде одной строки Unicode:
markup = '\nЯ связан с example.com\n '
суп = BeautifulSoup(разметка)
суп.get_text()
u'\nЯ связался с example.com\n'
суп.i.get_text()
u'example.com'
Вы можете указать строку, которая будет использоваться для соединения битов текста
вместе:
# суп.get_text("|")
u'\nЯ связан с |example.com|\n'
Вы можете указать Beautiful Soup удалять пробелы с самого начала и
конец каждого бита текста:
# soap.get_text("|", strip=True)
u'Я связан с |example.com'
Но в этот момент вы можете захотеть использовать . stripped_strings
вместо генератора и обработайте текст самостоятельно:
[текст для текста в супе.stripped_strings]
# [u'Я связан с', u'example.com']
Если вам просто нужно проанализировать HTML, вы можете сбросить разметку в конструктор BeautifulSoup , и, наверное, все будет хорошо. Красивый
Soup подберет для вас парсер и проанализирует данные. Но есть
несколько дополнительных аргументов, которые вы можете передать конструктору для изменения
какой парсер используется.
Первым аргументом конструктора BeautifulSoup является строка или
открытый дескриптор файла — разметка, которую вы хотите проанализировать. Второй аргумент как вы хотите анализировать разметку.
Если вы ничего не укажете, вы получите лучший анализатор HTML, который
установлены. Beautiful Soup оценивает синтаксический анализатор lxml как лучший, затем
html5lib, затем встроенный парсер Python. Вы можете переопределить это,
указав одно из следующего:
Какой тип разметки вы хотите анализировать. В настоящее время поддерживаются
«html», «xml» и «html5».
Имя библиотеки парсера, которую вы хотите использовать. В настоящее время поддерживается
варианты «lxml», «html5lib» и «html.parser» (Python’s
встроенный парсер HTML).
Раздел Установка парсера сравнивает поддерживаемые парсеры.
Если у вас не установлен соответствующий синтаксический анализатор, Beautiful Soup
проигнорируйте ваш запрос и выберите другой парсер. Прямо сейчас, единственный
поддерживаемый синтаксический анализатор XML — lxml. Если у вас не установлен lxml, спросите
для синтаксического анализатора XML вам его не даст, а запрос «lxml» не сработает
либо.
Различия между синтаксическими анализаторами
Beautiful Soup представляет один и тот же интерфейс для ряда различных
парсеры, но каждый парсер отличается. Различные парсеры будут создавать
разные деревья синтаксического анализа из одного и того же документа. Самые большие различия
находятся между парсерами HTML и парсерами XML. Вот краткий
документ, проанализированный как HTML:
BeautifulSoup("")
#
Поскольку пустой тег не является допустимым HTML, синтаксический анализатор превращает его в
Пара тегов .
Вот тот же документ, проанализированный как XML (для запуска требуется, чтобы вы
установлен lxml). Обратите внимание, что пустой тег остается в покое, а
что документ получает XML-декларацию, а не помещается
в тег.:
BeautifulSoup("", "xml")
#
# <а>а>
Существуют также различия между парсерами HTML. Если вы дадите Красивое
Будь то идеально сформированный HTML-документ, этих различий не будет.
иметь значение. Один парсер будет быстрее другого, но все они дадут
вам структура данных, которая выглядит точно так же, как исходный HTML
документ.
Но если документ не идеально сформирован, разные парсеры будут
дают разные результаты. Вот короткий недопустимый документ, проанализированный с помощью
HTML-парсер lxml. Обратите внимание, что оборванный тег
Как и html5lib, этот синтаксический анализатор игнорирует закрывающий тег
. в отличие
html5lib, этот синтаксический анализатор не пытается создать правильно сформированный HTML-код.
документа, добавив тег. В отличие от lxml, даже не беспокоит
чтобы добавить тег.
Поскольку документ «
» недействителен, ни один из этих методов не
«правильный» способ справиться с этим. Парсер html5lib использует методы
которые являются частью стандарта HTML5, поэтому он лучше всего претендует на звание
«правильный» способ, но все три метода являются законными.
Различия между парсерами могут повлиять на ваш скрипт. Если вы планируете
при распространении вашего сценария среди других людей или запуске его на нескольких
машины, следует указать парсер в BeautifulSoup конструктор. Это уменьшит вероятность того, что ваши пользователи проанализируют
документ отличается от того, как вы его анализируете.
Любой документ HTML или XML написан в определенной кодировке, такой как ASCII
или UTF-8. Но когда вы загрузите этот документ в Beautiful Soup, вы
обнаружить, что он был преобразован в Unicode:
разметка = "
Sacr\xc3\xa9 bleu!
"
суп = BeautifulSoup(разметка)
суп.h2
#
Синий священный!
суп.h2.строка
# u'Sacr\xe9 bleu!'
Это не волшебство. (Было бы неплохо.) Beautiful Soup использует
подбиблиотека под названием Unicode, Dammit для определения кодировки документа
и преобразовать его в Unicode. Автоопределяемая кодировка доступна как
атрибут .original_encoding объекта BeautifulSoup :
soap.original_encoding
'утф-8'
Unicode, черт возьми, в большинстве случаев угадывает правильно, но иногда
делает ошибки. Иногда угадывает правильно, но только после
побайтовый поиск документа, который занимает очень много времени. Если
если вы знаете кодировку документа заранее, вы можете избежать
ошибок и задержек, передав его конструктору BeautifulSoup как from_encoding .
Вот документ, написанный в ISO-8859-8. Документ настолько короткий, что
Unicode, Dammit не может его заблокировать и ошибочно идентифицирует как
ИСО-8859-7:
разметка = b"
\xed\xe5\xec\xf9
"
суп = BeautifulSoup(разметка)
суп.h2
νεμω
суп.original_encoding
«ИСО-8859-7»
Мы можем исправить это, передав правильный from_encoding :
Если вы не знаете, какая кодировка правильная, но знаете, что
Unicode, черт возьми, ты ошибаешься, ты можешь передать неправильные предположения в
как exclude_encodings :
Windows-1255 не на 100% верна, но эта кодировка совместима
надмножество ISO-8859-8, так что это достаточно близко. ( exclude_encodings — новая функция в Beautiful Soup 4.4.0.)
В редких случаях (обычно когда документ UTF-8 содержит текст, написанный на
совершенно другая кодировка), единственный способ получить Unicode может быть
заменить некоторые символы специальным символом Unicode
«ЗАМЕНЯЮЩИЙ СИМВОЛ» (U+FFFD, �). Если Unicode, Dammit нужно сделать
это установит .contains_replacement_characters атрибут
на True в объекте UnicodeDammit или BeautifulSoup . Этот
позволяет узнать, что представление Unicode не является точным
представление оригинала - некоторые данные были потеряны. Если документ
содержит �, но .contains_replacement_characters равно False ,
вы узнаете, что � изначально был там (как и в этом
абзац) и не заменяет отсутствующие данные.
Кодирование вывода
Когда вы выписываете документ из Beautiful Soup, вы получаете UTF-8
документ, даже если документ не был в UTF-8 с самого начала. Вот
документ, написанный в кодировке Latin-1:
Вы также можете вызвать encode() для объекта BeautifulSoup или любого
элемент в супе, как если бы это была строка Python:
суп.p.кодировать("латиница-1")
# '
Sacr\xe9 bleu!
'
суп.p.кодировать("utf-8")
# '
Sacr\xc3\xa9 bleu!
'
Любые символы, которые не могут быть представлены в выбранной вами кодировке, будут
быть преобразованы в числовые ссылки на объекты XML. Вот документ
который включает символ Юникода SNOWMAN:
Символ SNOWMAN может быть частью документа UTF-8 (выглядит как
☃), но для этого символа нет представления в ISO-Latin-1 или
ASCII, поэтому он преобразуется в « ».731” для этих кодировок:
Вы можете использовать Unicode, Dammit без использования Beautiful Soup. это полезно
всякий раз, когда у вас есть данные в неизвестной кодировке, и вы просто хотите, чтобы они
стать Unicode:
Unicode, догадки Дэммита станут намного точнее, если вы установите
библиотеки Python chardet или cchardet . Чем больше данных вы
дай юникод, черт возьми, тем точнее угадаешь. Если у вас есть
ваши собственные подозрения относительно кодировки, вы можете передать
их в виде списка:
Надеюсь, вы найдете эту функцию полезной, но Beautiful Soup — нет.
используй это. Beautiful Soup предпочитает поведение по умолчанию, т. е.
конвертировать смарт-кавычки Microsoft в символы Unicode вместе с
все остальное:
Я просто \u201clove\u2019 умные кавычки Microsoft Word
'
Несовместимые кодировки
Иногда документ в основном в UTF-8, но содержит Windows-1252
символы, такие как (опять же) умные кавычки Microsoft. Это может случиться
когда веб-сайт включает данные из нескольких источников. Вы можете использовать UnicodeDammit.detwingle() , чтобы превратить такой документ в чистый
УТФ-8. Вот простой пример:
При декодировании документа как UTF-8 возникает ошибка UnicodeDecodeError и
расшифровка его как Windows-1252 дает вам тарабарщину. К счастью, UnicodeDammit.detwingle() преобразует строку в чистую UTF-8,
что позволяет декодировать его в Unicode и отображать снеговиков и цитаты
отмечает одновременно:
UnicodeDammit.detwingle() знает только, как обращаться с Windows-1252
встроенный в UTF-8 (или наоборот, я полагаю), но это самый
общий случай.
Обратите внимание, что вы должны знать, что для вызова UnicodeDammit.detwingle() на вашем
данные перед передачей их в BeautifulSoup или UnicodeDammit конструктор. Beautiful Soup предполагает, что документ имеет единственный
кодировка, какой бы она ни была. Если вы передадите ему документ, который
содержит и UTF-8, и Windows-1252, скорее всего, думает, что весь
документ Windows-1252, и документ будет выглядеть так: ☃☃☃“Мне нравятся снеговики!” .
UnicodeDammit. detwingle() — новинка в Beautiful Soup 4.1.0.
Парсеры html.parser` и ``html5lib могут отслеживать, где в
исходный документ, каждый тег был найден. Вы можете получить доступ к этому
информация как Tag.sourceline (номер строки) и Tag.sourcepos (позиция начального тега в строке):
Обратите внимание, что два синтаксических анализатора имеют в виду немного разные вещи. sourceline и sourcepos . Для html.parser эти числа
представляют положение начального знака «меньше». Для html5lib,
эти числа представляют позицию последнего знака «больше»:
Эта функция является новой в версии 4.8.1, и синтаксические анализаторы на основе lxml не поддерживаются.
поддержите это.
Beautiful Soup сообщает, что два объекта NavigableString или Tag равны, если они представляют одну и ту же разметку HTML или XML. В этом
Например, два тега считаются равными, даже если они
в разных частях дерева объектов, потому что они оба выглядят как
“пицца”:
Единственная реальная разница в том, что копия полностью отделена от
оригинальное дерево объектов Beautiful Soup, как если бы экстракт() имел
был вызван на нем:
print p_copy.parent
# Никто
Это связано с тем, что два разных объекта Tag не могут занимать одно и то же место. пространство одновременно.
(Обратите внимание, что эта функция не будет работать, если вы используете парсер html5lib .
Если вы используете html5lib, будет проанализирован весь документ, нет
от того, что. Это потому, что html5lib постоянно перестраивает синтаксический анализ
дерево, как оно работает, и если какая-то часть документа на самом деле не
сделать это в дереве синтаксического анализа, он рухнет. Во избежание путаницы в
примеры ниже я заставлю Beautiful Soup использовать Python
встроенный парсер. )
SoupStrainer
Класс SoupStrainer принимает те же аргументы, что и типичный
метод из Searching the tree: name, attrs, string и **kwargs. Здесь
три объекта SoupStrainer :
из bs4 import SoupStrainer
only_a_tags = Ситечко для супа ("а")
only_tags_with_id_link2 = Ситечко для супа(id="link2")
определение is_short_string (строка):
возврат len (строка) < 10
only_short_strings = Ситечко для супа (string=is_short_string)
Я еще раз принесу документ «три сестры»,
и мы увидим, как выглядит документ, когда он будет проанализирован с помощью этих
три SoupStrainer объекты:
html_doc = """
История Сони
<тело>
История Сони
Жили-были три сестрички; и их имена были
Элси,
Лейси и
Тилли;
и жили они на дне колодца.
Если у вас возникли проблемы с пониманием того, что Beautiful Soup делает с
документ, передать документ в диагностика() функция. (Новое в
Beautiful Soup 4.2.0.) Beautiful Soup распечатает отчет, показывающий
вы узнаете, как разные парсеры обрабатывают документ, и сообщите, если вы
отсутствует синтаксический анализатор, который мог бы использовать Beautiful Soup:
из диагностики импорта bs4.diagnose
с open("bad.html") как fp:
данные = fp.read()
диагностировать (данные)
# Диагностика на Beautiful Soup 4.2.0
# Версия Python 2.7.3 (по умолчанию, 1 августа 2012 г., 05:16:07)
# Я заметил, что html5lib не установлен. Установка может помочь.
# Найден lxml версии 2.3.2.0
#
# Пытаемся разобрать ваши данные с помощью html.parser
# Вот что html.parser сделал с документом:
# ...
Просто взглянув на результат диагностики(), вы поймете, как решить проблему.
проблема. Даже если нет, вы можете вставить вывод диагностировать () , когда
просить помощи.
Ошибки при синтаксическом анализе документа
Существует два вида ошибок синтаксического анализа. Бывают сбои,
где вы отправляете документ в Beautiful Soup, и он поднимает
исключение, обычно HTMLParser. HTMLParseError . И есть
неожиданное поведение, когда дерево синтаксического анализа Beautiful Soup выглядит много
отличается от документа, использованного для его создания.
Почти ни одна из этих проблем не связана с Beautiful
Суп. Это не потому, что Beautiful Soup удивительно хорошо написана.
часть программного обеспечения. Это потому, что Beautiful Soup не содержит
код разбора. Вместо этого он полагается на внешние парсеры. Если один парсер
не работает с определенным документом, лучшее решение — попробовать
другой парсер. См. Установка парсера для получения подробной информации и парсера.
сравнение.
Наиболее распространенными ошибками синтаксического анализа являются HTMLParser.HTMLParseError:
неправильный начальный тег и HTMLParser.HTMLParseError: плохой конец
тег . Они оба генерируются встроенным в Python парсером HTML.
библиотека, и решение состоит в том, чтобы установить lxml или
html5lib.
Самый распространенный тип неожиданного поведения — невозможность найти
тег, который, как вы знаете, находится в документе. Вы видели, как он входит, но find_all() возвращает [] или find() возвращает None . Это
еще одна распространенная проблема со встроенным в Python парсером HTML, который
иногда пропускает теги, которые не понимает. Опять же, решение состоит в том, чтобы
установите lxml или html5lib.
Проблемы с несоответствием версий
SyntaxError: Неверный синтаксис (в строке ROOT_TAG_NAME =
u'[document]' ): вызван запуском Python 2 версии
Beautiful Soup под Python 3, без конвертации кода.
ImportError: нет модуля с именем HTMLParser — вызвано запуском
Версия Beautiful Soup для Python 2 под Python 3.
ImportError: нет модуля с именем html.parser — вызвано запуском
Версия Beautiful Soup для Python 3 под Python 2.
ImportError: нет модуля с именем BeautifulSoup — вызвано запуском
Код Beautiful Soup 3 в системе без BS3
установлены. Или, написав код Beautiful Soup 4, не зная, что
имя пакета изменилось на bs4 .
ImportError: нет модуля с именем bs4 — вызвано запуском Beautiful
Код Soup 4 в системе, в которой не установлена BS4.
Анализ XML
По умолчанию Beautiful Soup анализирует документы как HTML. Чтобы разобрать
документа в формате XML, передайте «xml» в качестве второго аргумента BeautifulSoup конструктор:
суп = BeautifulSoup(разметка, "xml")
Вам необходимо установить lxml.
Другие проблемы с парсером
Если ваш скрипт работает на одном компьютере, но не работает на другом, или на одном
виртуальной среде, но не другой, или вне виртуальной
окружающей среде, но не внутри, вероятно, потому, что два
средам доступны разные библиотеки парсеров. Например,
возможно, вы разработали скрипт на компьютере с lxml
установлен, а затем попытался запустить его на компьютере, на котором
html5lib установлен. См. Различия между парсерами, почему это
имеет значение, и устраните проблему, упомянув конкретную библиотеку синтаксического анализатора
в Конструктор BeautifulSoup .
Поскольку теги и атрибуты HTML нечувствительны к регистру, все три HTML-тега
синтаксические анализаторы преобразуют имена тегов и атрибутов в нижний регистр. Это
разметка преобразуется в . Если ты хочешь
сохранять теги и атрибуты в смешанном или верхнем регистре, вам нужно будет
разобрать документ как XML.
Разное
UnicodeEncodeError: кодек 'charmap' не может кодировать символ
u'\xfoo' в такте позиции (или почти любой другой UnicodeEncodeError ) — это не проблема с Beautiful Soup.
Эта проблема проявляется в двух основных ситуациях. Во-первых, когда вы пытаетесь
напечатать символ Unicode, который ваша консоль не знает, как
отображать. (См. эту страницу в вики Python для справки.) Во-вторых, когда
вы пишете в файл и передаете символ Unicode, который
не поддерживается вашей кодировкой по умолчанию. В этом случае самый простой
решение состоит в том, чтобы явно закодировать строку Unicode в UTF-8 с помощью u.encode("utf8") .
KeyError: [attr] — вызвано доступом к тегу ['attr'] , когда
рассматриваемый тег не определяет атрибут attr . Большинство
распространенными ошибками являются KeyError: 'href' и KeyError:
'класс' . Используйте tag.get('attr') , если вы не уверены, что attr определено так же, как если бы вы использовали словарь Python.
AttributeError: объект «ResultSet» не имеет атрибута «foo» — это
обычно происходит потому, что вы ожидали find_all() для возврата
один тег или строка. Но find_all() возвращает _list_ тегов
и строки — объект ResultSet . Вам нужно перебрать
list и посмотрите на .foo каждого из них. Или, если вы действительно только
хотите один результат, вам нужно использовать find() вместо найти_все() .
AttributeError: объект «NoneType» не имеет атрибута «foo» — это
обычно происходит потому, что вы вызвали find() , а затем попытались
получить доступ к .foo` атрибут результата. Но в вашем случае, find() ничего не нашел, поэтому вернул None вместо
возвращает тег или строку. Вы должны выяснить, почему ваш find() вызов ничего не возвращает.
Повышение производительности
Beautiful Soup никогда не будет таким же быстрым, как парсеры, на которых он установлен
из. Если время отклика критично, если вы платите за компьютерное время
по часам, или если есть какая-либо другая причина, по которой компьютерное время больше
ценнее, чем время программиста, вы должны забыть о Beautiful Soup
и работать непосредственно поверх lxml.
Тем не менее, есть вещи, которые вы можете сделать, чтобы ускорить Beautiful Soup. Если
вы не используете lxml в качестве базового синтаксического анализатора, мой совет:
Начало. Beautiful Soup разбирает документы
значительно быстрее при использовании lxml, чем при использовании html.parser или html5lib.
Вы можете значительно ускорить обнаружение кодировки, установив
библиотека ccardet.
Синтаксический анализ только части документа не сэкономит вам много времени на анализ
документ, но это может сэкономить много памяти, и это сделает поиск документ намного быстрее.
Новые переводы документации Beautiful Soup значительно
оценил. Переводы должны быть лицензированы по лицензии MIT,
точно так же, как Beautiful Soup и его англоязычная документация.
Есть два способа добавить перевод в основную кодовую базу.
и на сайт Beautiful Soup:
Создайте ветку репозитория Beautiful Soup, добавьте свой
перевод, и предложить слияние с основной веткой, то же самое
как вы поступили бы с предлагаемым изменением исходного кода.
Отправьте сообщение в дискуссионную группу Beautiful Soup со ссылкой на
свой перевод или прикрепите свой перевод к сообщению.
В качестве образца используйте перевод на китайский или бразильский португальский язык. В
в частности, переведите исходный файл doc/source/index.rst ,
а не HTML-версия документации. Это делает это
возможность публиковать документацию в различных форматах, не
просто HTML.
Beautiful Soup 3 — это предыдущая серия выпусков, которая больше не
активно развивается. В настоящее время он поставляется со всеми основными версиями Linux.
раздачи:
$ apt-get install python-beautifulsoup
It's also published through PyPi as BeautifulSoup .:
$ easy_install BeautifulSoup
$ pip install BeautifulSoup
You can also download a tarball of Beautiful Суп 3.2.0.
Если вы запустили easy_install, beautifulsoup или easy_install
BeautifulSoup , но ваш код не работает, вы установили Beautiful
Суп 3 по ошибке. Вам нужно запустить easy_install beautifulsoup4 .
Документация по Beautiful Soup 3 находится в онлайн-архиве.
Перенос кода на BS4
Большая часть кода, написанного для Beautiful Soup 3, будет работать и для Beautiful
Суп 4 с одним простым изменением. Все, что вам нужно сделать, это изменить
имя пакета с BeautifulSoup на bs4 . Итак:
из BeautifulSoup импортирует BeautifulSoup
становится следующим:
из импорта bs4 BeautifulSoup
Если вы получаете ImportError «Нет модуля с именем BeautifulSoup», ваш
проблема в том, что вы пытаетесь запустить код Beautiful Soup 3, но вы
установлен только Beautiful Soup 4.
Если вы получаете ImportError «Нет модуля с именем bs4», ваша проблема
заключается в том, что вы пытаетесь запустить код Beautiful Soup 4, но вы только
установить Beautiful Soup 3.
Хотя BS4 в основном обратно совместима с BS3, большинство его
методы устарели и получили новые имена для соответствия PEP 8. Есть множество других
переименовывает и изменяет, а некоторые из них нарушают обратную совместимость.
Вот что вам нужно знать, чтобы преобразовать код и привычки BS3 в BS4:
Вам нужен синтаксический анализатор
Beautiful Soup 3 использовал модуль SGMLParser Python,
устарел и удален в Python 3.0. Красивый суп 4 использования html.parser по умолчанию, но вы можете подключить lxml или html5lib и
используйте это вместо этого. См. Установка парсера для сравнения.
Поскольку html.parser — это не тот же парсер, что и SGMLParser , вы
может обнаружить, что Beautiful Soup 4 дает вам дерево синтаксического анализа, отличное от
Beautiful Soup 3 за ту же разметку. Если поменять местами html.parser для lxml или html5lib вы можете обнаружить, что дерево синтаксического анализа еще не изменилось
опять таки. Если это произойдет, вам нужно будет обновить код парсинга до
разобраться с новым деревом.
Имена методов
renderContents -> encode_contents
replaceWith -> replace_with
replaceWithChildren -> развернуть
найти все -> найти все
findAllNext -> find_all_next
findAllPrevious -> find_all_previous
findNext -> find_next
findNextSibling -> find_next_sibling
findNextSiblings -> find_next_siblings
findParent -> find_parent
найти родителей -> найти_родителей
findPrevious -> find_previous
findPreviousSibling -> find_previous_sibling
findPreviousSiblings -> find_previous_siblings
getText -> get_text
nextSibling -> next_sibling
предыдущий одноуровневый элемент -> предыдущая одноуровневая версия
Некоторые аргументы конструктора Beautiful Soup были переименованы для
те же причины:
Я переименовал один метод для совместимости с Python 3:
Tag.has_key() -> Tag.has_attr()
Я переименовал один атрибут, чтобы использовать более точную терминологию:
Tag.isSelfClosing -> Tag.is_empty_element
Я переименовал три атрибута, чтобы не использовать слова, имеющие особое значение.
значение для Python. В отличие от других, эти изменения не в обратном порядке.
совместимый. Если вы использовали эти атрибуты в BS3, ваш код сломается
на BS4, пока вы их не измените.
Некоторые из генераторов давали None после того, как они были выполнены, и
тогда остановись. Это была ошибка. Теперь генераторы просто останавливаются.
Есть два новых генератора, .strings и
.stripped_strings. .strings дает
Объекты NavigableString и .stripped_strings дают Python
строки, в которых были удалены пробелы.
XML
Больше нет Класс BeautifulStoneSoup для разбора XML. К
анализировать XML, который вы передаете в «xml» в качестве второго аргумента Конструктор BeautifulSoup . По той же причине Конструктор BeautifulSoup больше не распознает isHTML аргумент.
Beautiful Soup обрабатывает теги XML с пустыми элементами.
улучшенный. Раньше, когда вы анализировали XML, вам нужно было явно указать
какие теги считались тегами пустых элементов. selfClosingTags аргумент конструктора больше не распознается. Вместо,
Beautiful Soup считает любой пустой тег тегом пустого элемента. Если
вы добавляете дочерний элемент в тег пустого элемента, он перестает быть
тег пустого элемента.
Объекты
Входящий объект HTML или XML всегда преобразуется в
соответствующий символ Юникода. В Beautiful Soup 3 было несколько
перекрывающиеся способы работы с сущностями, которые были
удаленный. Конструктор BeautifulSoup больше не распознает smartQuotesTo или convertEntities аргументов. (Юникод,
Черт побери, все еще есть smart_quotes_to , но по умолчанию теперь
умные кавычки в Unicode.) Константы HTML_ENTITIES , XML_ENTITIES и XHTML_ENTITIES были удалены, так как они
настроить функцию (преобразование некоторых, но не всех объектов в
символы Unicode), которого больше не существует.
Если вы хотите превратить символы Unicode обратно в объекты HTML на
вывод, а не превращать их в символы UTF-8, вам нужно
используйте средство форматирования вывода.
Разное
Строка тегов теперь работает рекурсивно. Если тег А
содержит один тег B и ничего больше, то A. string совпадает с
B.строка. (Ранее это было None.)
Многозначные атрибуты, такие как class , имеют списки строк как
их значения, а не строки. Это может повлиять на способ поиска с помощью CSS.
учебный класс.
Если вы передадите один из методов find* , обе строки и специфический для тега аргумент, такой как имя, Beautiful Soup будет
поиск тегов, которые соответствуют вашим критериям тегов и чьи
Tag.string соответствует вашему значению для строки. , а не сами найдут строки. Ранее,
Beautiful Soup игнорировал аргументы, относящиеся к тегам, и искал
струны.
Конструктор BeautifulSoup больше не распознает markupMassage аргумент. Теперь парсер отвечает за
корректно обрабатывать разметку.
Редко используемые альтернативные классы синтаксического анализатора, такие как ICantBelieveItsBeautifulSoup и BeautifulSOAP были
удаленный. Теперь синтаксический анализатор решает, как обрабатывать неоднозначные
наценка.
Метод prettify() теперь возвращает строку Unicode, а не строку байтов.
Requests и BeautifulSoup — LearnDataSci
Автор: Brendan Martin Основатель LearnDataSci
Первая часть этой серии посвящена запросу и обработке HTML с использованием двух самых популярных библиотек Python для парсинга веб-страниц: Requests и BeautifulSoup
. После выборов 2016 года меня гораздо больше стали интересовать предвзятость СМИ и манипулирование людьми с помощью рекламы. Эта серия будет пошаговым обзором проекта веб-скрапинга, который отслеживает политические новости как левых, так и правых СМИ и выполняет анализ используемой риторики, отображаемой рекламы и настроений по определенным темам.
Записная книжка для этого руководства — GitHub
В первой части серии мы будем получать данные о предвзятости медиа и сосредоточимся только на локальной работе на вашем компьютере, но если вы хотите узнать, как развернуть что-то подобное в рабочей среде, не стесняйтесь оставлять комментарии и дайте мне знать.
Вы уже должны знать:
Основы Python — списки, словари, функции, циклы — изучайте на Coursera
Базовый HTML
Вы изучите:
Запрос веб-страниц
Анализ HTML
Сохранение и загрузка очищенных данных
Скрейпинг нескольких страниц подряд
просто человек с браузером, вы не можете причинить большого вреда. С помощью скрипта Python, который может выполнять тысячи запросов в секунду при неправильном кодировании, вы можете в конечном итоге дорого обойтись владельцу веб-сайта и, возможно, вывести его сайт из строя (см. Атака типа «отказ в обслуживании» (DoS)).
Имея это в виду, мы хотим быть очень осторожными с тем, как мы программируем парсеры, чтобы избежать сбоев сайтов и причинения ущерба. Каждый раз, когда мы очищаем веб-сайт, мы пытаемся сделать только один запрос на страницу . Мы не хотим делать запрос каждый раз, когда наш синтаксический анализ или другая логика не работают, поэтому нам нужно выполнять синтаксический анализ только после того, как мы сохранили страницу локально.
Если я просто делаю несколько быстрых тестов, я обычно начинаю с блокнота Jupyter, потому что вы можете запросить веб-страницу в одной ячейке и сделать эту веб-страницу доступной для каждой ячейки под ней без создания нового запроса. Поскольку эта статья доступна в виде записной книжки Jupyter, вы увидите, как она работает, если выберете этот формат.
После того, как мы сделали запрос и получили содержимое веб-страницы, мы можем сохранить это содержимое локально с помощью функции Python open() . Для этого нам нужно использовать аргумент wb , что означает «записать байты». Это позволяет избежать проблем с кодировкой при сохранении.
Ниже приведена функция, которая является оберткой для функции open() , чтобы в дальнейшем уменьшить объем повторяющегося кода:
def save_html(html, path):
с открытым (путь, 'wb') как f:
f.написать (html)
save_html(r. content, 'google_com')
Предположим, мы захватили HTML-код с google.com в html , что вы увидите позже, как это сделать. После запуска этой функции у нас теперь будет файл в том же каталоге, что и эта записная книжка, с именем google_com , который содержит HTML.
Чтобы получить наш сохраненный файл, мы создадим еще одну функцию, чтобы обернуть чтение HTML обратно в html . В этом случае нам нужно использовать rb для «чтения байтов».
по умолчанию open_html (путь):
с открытым (путь, 'rb') как f:
вернуть f.read()
html = open_html('google_ru')
Функция open делает прямо противоположное: читает HTML из google_com . Если наш скрипт дает сбой, блокнот закрывается, компьютер выключается и т. д., нам больше не нужно снова запрашивать Google, что снижает наше влияние на их серверы. Хотя для Google это не имеет большого значения, поскольку у них много ресурсов, небольшие сайты с меньшими серверами выиграют от этого.
Я сохраняю почти каждую страницу и анализирую ее позже при парсинге из соображений безопасности.
Каждый сайт обычно имеет robots.txt в корне своего домена. Здесь владелец веб-сайта прямо указывает, что ботам разрешено делать на его сайте. Просто зайдите на example.com/robots.txt, и вы должны найти текстовый файл, который выглядит примерно так:
Поле User-agent — это имя бота, а следующие правила — это то, чему бот должен следовать. В файле robots.txt может быть много пользовательских агентов с разными правилами. Обычных ботов googlebot , bingbot и applebot , о назначении и происхождении которых вы, вероятно, догадываетесь.
На самом деле нам не нужно предоставлять User-agent при парсинге, поэтому User-agent: * — это то, чему мы будем следовать. * означает, что следующие правила применяются ко всем ботам (это мы).
Crawl-delay сообщает нам количество секунд ожидания перед запросами, поэтому в этом примере нам нужно подождать 10 секунд, прежде чем делать новый запрос.
Разрешить дает нам определенные URL-адреса, которые мы можем разрешить запрашивать с ботами, и наоборот для Запретить . В этом примере нам разрешено запрашивать что угодно в подпапке /pages/ , что означает все, что начинается с example.com/pages/ . С другой стороны, нам запрещено очищать что-либо из подпапки /scripts/.
Много раз вы будете видеть * рядом с Разрешить или Запретить, что означает, что вам либо разрешено, либо запрещено очищать все на сайте.
Иногда будут запрещены все страницы, за которыми следуют разрешенные страницы, например:
Запретить: *
Разрешить: /pages/
Это означает, что вам не разрешено очищать что-либо кроме подпапки /pages/ . По сути, вы просто хотите прочитать правила в том порядке, в котором следующее правило переопределяет предыдущее правило.
Этот проект в основном будет выполняться через блокнот Jupyter, который предназначен для учебных целей и не является обычным способом программирования парсеров. После того, как мы покажем вам фрагменты, мы объединим их в скрипт Python, который можно запустить из командной строки или выбранной вами IDE.
С библиотекой запросов Python ( запросов на установку pip ) мы получаем веб-страницу, используя get() в URL-адресе. Ответ r содержит много вещей, но использование r.content даст нам HTML. Получив HTML-код, мы можем разобрать его на предмет данных, которые нам интересны для анализа.
Есть интересный веб-сайт под названием AllSides , на котором есть таблица рейтинга предвзятости СМИ, где пользователи могут согласиться или не согласиться с рейтингом.
Media Bias Ratings на AllSides
Поскольку в их файле robots. txt нет ничего, что запрещало бы нам очищать этот раздел сайта, я полагаю, что можно продолжить и извлечь эти данные для нашего проекта. Давайте запросим эту первую страницу:
запросов на импорт
url = 'https://www.allsides.com/media-bias/media-bias-ratings'
г = запросы.get(url)
print(r.content[:100])
Out:
b'\n\n добавлены мной):
таблица>
Итак, чтобы получить каждую строку, мы просто выбираем все
внутри :
rows = суп.
( t able r ow) теги, которые являются дочерними тегами body. Если бы на этой странице было больше одной таблицы, нам пришлось бы сделать более конкретный селектор, но поскольку это единственная таблица, все готово.
Теперь у нас есть список строк таблицы HTML, каждая из которых содержит четыре ячейки:
Имя выхода ( ABC News ) представляет собой текст тега привязки, вложенного в
тег, который представляет собой ячейку — или t способный d тег ata.
Получить имя выхода довольно просто: просто получите первую строку в rows и запустите select_one для этого объекта:
row = rows[0]
имя = row. select_one('.source-title').text.strip()
print(name)
Out:
ABC News
Единственным классом, который нам нужно было использовать в этом случае, был .source-title , так как .views-field выглядит просто классом, который задается для стилизации каждой строки и не обеспечивает никакой уникальности.
Обратите внимание, что нам не нужно беспокоиться о выборе тега привязки a , содержащего текст. Когда мы используем .text , он получает весь текст в этом элементе, и поскольку «ABC News» — единственный текст, это все, что нам нужно сделать. Имейте в виду, что использование select или select_one даст вам весь элемент с включенными тегами, поэтому нам нужно .text , чтобы дать нам текст между тегами.
.strip() обеспечивает удаление всех пробелов вокруг имени. Многие веб-сайты используют пробелы для визуального заполнения текста внутри элементов, поэтому использование strip() всегда хорошая идея.
Вы заметите, что мы можем запускать методы BeautifulSoup сразу в одной из строк. Это потому, что строки становятся их собственными объектами BeautifulSoup, когда мы делаем выбор из другого объекта BeautifulSoup. С другой стороны, наша переменная name больше не является объектом BeautifulSoup, потому что мы назвали .text .
Нам также нужна ссылка на страницу этого источника новостей на AllSides. Если мы вернемся к HTML, то увидим, что в этом случае мы do хотите выбрать якорь, чтобы получить href , содержащий ссылку, поэтому давайте сделаем это:
Это относительный путь в HTML, поэтому мы добавляем URL-адрес сайта, чтобы сделать это ссылка, которую мы можем запросить позже.
Получение ссылки немного отличается от простого выбора элемента. Нам нужно было получить доступ к атрибут ( href ) элемента, который делается с помощью квадратных скобок, подобно тому, как мы получили бы доступ к словарю Python. То же самое будет и для других атрибутов элементов, таких как src в изображениях и видео.
Мы видим, что рейтинг отображается в виде изображения, так как же нам получить рейтинг словами? Глядя на HTML, обратите внимание, что ссылка, окружающая изображение, содержит нужный нам текст:
Мы также могли бы использовать атрибут alt , но ссылка выглядит проще. Возьмем его:
Здесь мы выбрали тег привязки, используя имя класса и тег вместе: .views-field-field-bias-image — это класс
и для якоря, вложенного внутрь.
После этого извлекаем href , как и раньше, но теперь нам нужна только последняя часть URL-адреса для имени уклона, поэтому мы разделяем косые черты и получаем последний элемент этого разделения ( left-center ).
Последнее, что нужно очистить, — это соотношение «согласен/не согласен» из области отзывов сообщества. HTML этой ячейки довольно запутан из-за стиля, но вот основная структура:
Нужные нам числа расположены в двух элементах span в последнем div . Оба элемента span имеют классы, уникальные в этой ячейке, поэтому мы можем использовать их для выбора:
accept = row.select_one('.agree').text
согласен = int (согласен)
не согласен = row.select_one('.disagree').текст
не согласен = int (не согласен)
accept_ratio = согласен / не согласен
print(f"Согласен: {согласен}, Не согласен: {не согласен}, Отношение {agree_ratio:.2f}")
Исход:
Согласен: 8411, Не согласен: 6662, Отношение 1,26
Использование . text вернет строку, поэтому нам нужно преобразовать их в целые числа, чтобы вычислить отношение.
Примечание: Если вы никогда не видели такой способ форматирования операторов печати в Python, f в начале позволяет нам вставлять переменные прямо в строку с помощью фигурных скобок. :.2f — это способ форматирования чисел с плавающей запятой для отображения только двух знаков после запятой.
Если вы посмотрите на страницу в своем браузере, вы заметите, что они говорят, насколько сообщество согласно, используя «в некоторой степени согласен», «полностью согласен» и т. д., так как же мы это получим? Если мы попытаемся выбрать его:
Отображается как None, потому что этот элемент отображается с помощью Javascript и запросов не может получить HTML визуализируется с помощью Javascript. Мы рассмотрим, как получить данные, отображаемые с помощью JS, в следующей статье, но, поскольку это единственная часть информации, которая отображается таким образом, мы можем вручную воссоздать текст.
Чтобы найти файлы JS, которые они используют, просто нажмите CTRL+F для «.js» в исходном коде страницы и откройте файлы в новой вкладке, чтобы найти эту логику.
Оказалось логика находится в одиннадцатом JS файле и у них есть функция которая вычисляет текст и цвет с такими параметрами:
Диапазон
Согласие
908$ratio >$ratio
Абсолютно соглашается
$ 2 <Соотношение \ LEQ 3 $
Тщательно соглашается
$ 1,5 <Коэффициент \ LEQ 2 $
$ 1,5 <Коэффициент \ LEQ 2 $
соглашается
9 9084 $
3
$.0854
somewhat agrees
$ratio = 1$
neutral
$0. 67 < ratio < 1$
somewhat disgrees
$0.5 < ratio \leq 0.67$
disgrees
$0.33 < ratio \leq 0.5$
полностью не согласен
$ratio \leq 0.33$
абсолютно не согласен
Давайте создадим функцию, которая повторяет эту логику:
по определению get_agreeance_text (соотношение):
если отношение > 3: вернуть "абсолютно согласен"
elif 2 < ratio <= 3: вернуть «полностью согласен»
elif 1.5 < ratio <= 2: возврат «согласен»
elif 1 < ratio <= 1.5: вернуть "отчасти согласен"
elif ratio == 1: вернуть «нейтральный»
elif 0.67 < ratio < 1: вернуть "несколько не согласен"
elif 0.5 < ratio <= 0.67: вернуть "не согласен"
elif 0,33 < ratio <= 0,5: вернуть «категорически не согласен»
elif ratio <= 0,33: возврат «абсолютно не согласен»
иначе: вернуть None
печать (get_agreeance_text (2. 5))
Out:
полностью согласен
Теперь, когда у нас есть общая логика для одной строки и мы можем сгенерировать текст соглашения, давайте создадим цикл, который будет получать данные из каждой строки на первой странице:
Имейте в виду, что это еще только первая страница . На момент написания этой статьи список на AllSides состоит из трех страниц, поэтому нам нужно изменить этот цикл, чтобы получить другие страницы.
Обратите внимание, что URL-адреса для каждой страницы следуют шаблону. Первая страница не имеет параметров в URL-адресе, но следующие страницы имеют; в частности, они прикрепляют ?page=# к URL-адресу, где '#' - это номер страницы.
На данный момент самый простой способ получить все страницы — просто вручную составить список из этих трех страниц и просмотреть их. Если бы мы работали над проектом с тысячами страниц, мы могли бы создать более автоматизированный способ создания/поиска следующих URL-адресов, но пока это работает.
В соответствии с robots.txt AllSides нам нужно убедиться, что мы ждем десять секунд перед каждым запросом.
Наш цикл будет:
запрашивать страницу
анализировать страницу
ждать десять секунд
повторять для следующей страницы.
Помните, мы уже тестировали вышеописанный синтаксический анализ на странице, которая была кэширована локально, поэтому мы знаем, что она работает. Вы должны убедиться, что сделали это до того, как создадите цикл, который выполняет запросы, чтобы предотвратить повторный цикл, если вы забыли что-то проанализировать.
Объединив все шаги, которые мы сделали до этого момента, и добавив цикл по страницам, вот как это выглядит:
from time import sleep
данные = []
для страницы на страницах:
г = запросы.получить(страница)
суп = BeautifulSoup(r.content, 'html.parser')
строки = суп.выбрать('tbody tr')
для строки в строке:
д = дикт()
d['name'] = row.select_one('.source-title').text.strip()
d['allsides_page'] = 'https://www.allsides.com' + row.select_one('.source-title a')['href']
d['bias'] = row.select_one('.views-field-field-bias-image a')['href'].split('/')[-1]
d['согласен'] = int(row.select_one('.согласен').текст)
d['не согласен'] = int(row.select_one('.не согласен').текст)
d['соотношение_согласия'] = d['согласен'] / d['не согласен']
d['текст_согласия'] = get_text_agreeance(d['коэффициент_согласия'])
data. append(d)
спать(10)
Теперь у нас есть список словарей для каждой строки на всех трех страницах.
В довершение всего, мы хотим получить настоящий URL-адрес источника новостей, а не только ссылку на их присутствие на AllSides. Для этого нам нужно будет зайти на страницу AllSides и найти ссылку.
Если мы перейдем на страницу ABC News, там будет ряд внешних ссылок на Facebook, Twitter, Wikipedia и веб-сайт ABC News. HTML для этих разделов выглядит так:
Обратите внимание, что тег привязки ( ), содержащий ссылку на ABC News, имеет класс «www». Довольно легко получить с тем, что мы уже узнали:
веб-сайт = суп.выберите_one('.www')['href']
Итак, давайте сделаем еще один цикл, чтобы запросить страницу AllSides и получить ссылки для каждого источника новостей. К сожалению, на некоторых страницах в этой серой полосе нет ссылки на источник новостей, что наводит на мысль: всегда учитывает элементы, которые случайно не существуют .
До сих пор мы предполагали, что элементы существуют в таблицах, которые мы очищали, но всегда полезно программировать парсеры таким образом, чтобы они не ломались, когда элемент отсутствует.
Использование select_one или select всегда будет возвращать None или пустой список, если ничего не найдено, поэтому в этом цикле мы проверим, нашли ли мы элемент веб-сайта или нет, чтобы он не выдавал исключение при попытке получить доступ к атрибуту href .
Наконец, поскольку имеется 265 страниц источника новостей и время ожидания между страницами составляет 10 секунд, это займет ~44 минуты. Вместо того, чтобы слепо не знать о нашем прогрессе, давайте использовать tqdm library ( pip install tqdm ), чтобы дать нам хороший индикатор выполнения:
from copy import deepcopy
из tqdm импортировать tqdm_notebook
для d в tqdm_notebook (данные):
r = запросы.get(d['allsides_page'])
суп = BeautifulSoup(r.content, 'html.parser')
пытаться:
веб-сайт = суп.select_one('.www')['href']
d['веб-сайт'] = веб-сайт
кроме TypeError:
проходить
sleep(10)
tqdm сначала немного странно, но по существу tqdm_notebook просто оборачивает наш список данных, чтобы создать индикатор выполнения. Мы по-прежнему можем получить доступ к каждому словарю, d , как обычно. Обратите внимание, что tqdm_notebook предназначен только для ноутбуков Jupyter. В обычных редакторах вы просто импортируете tqdm из tqdm и вместо этого используете tqdm .
Итак, что мы имеем сейчас? На данный момент данные представляют собой список словарей, каждый из которых содержит все данные из таблиц, а также сайты со страницы каждого отдельного источника новостей на AllSides.
Первое, что нам сейчас нужно сделать, это сохранить эти данные в файл, чтобы нам не приходилось делать эти запросы снова. Мы будем хранить данные в формате JSON, так как они уже в таком виде:
import json
с open('allsides.json', 'w') как f:
json.dump(data, f)
Чтобы загрузить его обратно, когда он вам понадобится:
с open('allsides. json', 'r') как f:
data = json.load(f)
Если вы не знакомы с JSON, просто быстро откройте allsides.json в редакторе и посмотрите, как это выглядит. Это должно выглядеть почти так же, как data выглядит так, если мы напечатаем его в Python: список словарей.
Прежде чем закончить эту статью, я думаю, было бы полезно посмотреть, что интересного в этих данных, которые мы только что получили. Итак, давайте ответим на пару вопросов.
С какими оценками торговых точек сообщество полностью согласно ?
Чтобы найти, где сообщество абсолютно согласно, мы можем сделать простое понимание списка, которое проверяет каждые dict для текста соглашения, который мы хотим:
abs_agree = [d вместо d в данных if d['agreeance_text'] == 'абсолютно согласен']
print(f"{'Выход':<20} {'Смещение':<20}")
печать("-" * 30)
для d в abs_agree:
print(f"{d['name']:<20} {d['bias']:<20}")
Out:
Outlet Bias
------------------------------
C-SPAN центр
Текущие дела слева
InfoWars право
Якобинец ушел
Mashable слева
Мать Джонс ушла
PoliticusUSA оставил
Красное государственное право
RollingStone. com ушел
осколок слева
Ежедневный сигнал прямо
Вице-левый
Используя форматирование строк, мы можем сделать их табличными. Интересно, что C-SPAN — это единственный центральный уклон, с которым сообщество абсолютно согласно. Остальные для левого и правого не так уж удивительны.
С какими оценками торговых точек сообщество абсолютно не согласно ?
Чтобы немного упростить анализ, мы также можем загрузить наши данные JSON в Pandas DataFrame. Это легко сделать с Pandas, поскольку у них есть простая функция для чтения JSON в DataFrame.
Кроме того, если вы никогда не использовали Pandas ( pip install pandas ), Matplotlib ( pip install matplotlib ) или любую другую библиотеку по науке о данных, я определенно рекомендую ознакомиться с курсом по науке о данных Хосе Портильи. за отличное введение в эти инструменты и многие концепции машинного обучения.
df[df['agreeance_text'] == 'категорически не согласен']
Out:
согласен
соглашение4text 9088842
allsides_page
bias
disagree
name
CNBC
1239
0.398905
strongly disagrees
https://www.allsides.com/news -source/cnbc
center
3106
Quillette
45
0. 416667
категорически не согласен
0854
Право-центр
108
Courier-Journal
64
0,410256
Сильные. left-center
156
The Economist
779
0.485964
strongly disagrees
https://www.allsides.com/news-source/economist
left-center
1603
The Observer (New York)
123
0.484252
strongly disagrees
https://www.allsides.com/news-source/observer
center
254
The Oracle
33
0.485294
strongly disagrees
https://www.allsides.com/news-source/oracle
center
68
The Republican
108
0.3
strongly disagrees
https://www.allsides.com/news-source/republican
center
275
Похоже, что большая часть сообщества категорически не согласна с тем, что некоторые СМИ оцениваются как «центральные».
Давайте сделаем быструю визуализацию согласия. Поскольку источников новостей слишком много, давайте выберем только те, которые набрали наибольшее количество голосов. Для этого мы можем создать новый столбец, который подсчитывает общее количество голосов, а затем сортировать по этому значению:
With the top 25 news sources by количество отзывов, давайте создадим гистограмму с накоплением, где число согласных расположены над числом несогласных . Это делает общую высоту полосы общим количеством отзывов.
Ниже мы сначала создаем фигуру и оси, наносим столбцы согласия, наносим столбцы несогласия поверх согласований, используя снизу , затем устанавливаем различные текстовые функции:
Для немного более сложной версии давайте создадим подсюжет для каждого предубеждения и нанесем соответствующие источники новостей.
На этот раз мы заранее создадим новую копию исходного DataFrame, так как теперь мы можем отображать больше выпусков новостей.
Вместо того, чтобы создавать одну ось, мы создадим новую для каждого смещения, чтобы получить шесть подграфиков:
df3 = df.copy()
рис = plt.figure(figsize=(15,15))
смещения = df3['предвзятость'].unique()
для i смещение в перечислении (смещения):
# Получить 10 лучших источников новостей для этого уклона и отсортировать индекс по алфавиту
temp_df = df3[df3['смещение'] == смещение].iloc[:10]
temp_df.sort_index (на месте = Истина)
# Получить максимальное количество голосов, т.е. значение y для самого высокого бара в этом временном кадре данных
max_votes = temp_df['total_votes'].max()
# Добавляем новый участок в правильную позицию сетки
топор = fig.add_subplot (длина (смещения) / 2, 2, я + 1)
# Создаем сложенные бары
ax. bar(temp_df.index, temp_df['согласен'], color='#5DAF83')
ax.bar(temp_df.index, temp_df['не согласен'], дно=temp_df['согласен'], цвет='#AF3B3B')
# Разместите текст соотношения над каждым столбцом
для x, y, соотношение в zip(ax.get_xticks(), temp_df['total_votes'], temp_df['agree_ratio']):
ax.text(x, y + (0,02 * max_votes), f"{ratio:.2f}", ha='center')
ax.set_ylabel('Всего отзывов')
ax.set_title (смещение. название ())
# Увеличить лимит y, чтобы компенсировать текст на полосах
ax.set_ylim (0, max_votes + (0,12 * max_votes))
# Поворачиваем галочки так, чтобы они не перекрывались
plt.setp(ax.get_xticklabels(), вращение=30, ha='право')
plt.tight_layout(w_pad=3.0, h_pad=1.0)
plt.show()
РЕЗУЛЬТАТ:
Надеемся, что комментарии помогут понять, как были созданы эти графики. Мы просто перебираем каждое уникальное смещение и добавляем к рисунку подзаговор.
При интерпретации этих графиков имейте в виду, что ось Y имеет разные масштабы для каждого подграфика.