{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы программирования в Python\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на другие примеры использования `selenium`. \n", "\n", "**Пример.** Зайдем на сайт книжного магазина и найдем все книги В.Пелевина. Загрузим библиотеку, веб-драйвер и откроем страницу в браузере через Python." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from selenium import webdriver as wb\n", "br = wb.Chrome(\"/Users/allat/Downloads/chromedriver\")\n", "\n", "# открываем страницу в Chrome в автоматическом режиме\n", "br.get(\"http://www.biblio-globus.ru/\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем с помощью CSS Selector'а (*SelectorGadget*) поле для ввода названия книги или автора. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "field = br.find_element_by_css_selector(\"input\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сохраним фамилию автора:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "author = \"Пелевин\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Введем фамилию автора в поле для поиска (`.send_keys`) и подождем чуть-чуть:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "field.send_keys(\"Пелевин\")\n", "br.implicitly_wait(2) # подождем пару секунд" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь найдем кнопку для поиска (значок *лупа* рядом со строкой поиска) через CSS Selector:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "submit = br.find_element_by_css_selector(\"#search_submit\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Кликнем на нее:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "submit.click()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сохраним первую страницу с результатами в переменную `page1`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "page1 = br.page_source" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "page1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь обработаем эту страницу через `BeautifulSoup`:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "from bs4 import BeautifulSoup" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "soup1 = BeautifulSoup(page1, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Найдем все названия книг на этой странице. По исходному коду можно увидеть, что они имеют тэг `a` с атрибутом `class`, равным `name`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Четверо,\n", " iPhuck 10,\n", " Чапаев и Пустота,\n", " Священная книга оборотня,\n", " S.N.U.F.F.,\n", " Лампа Мафусаила, или Крайняя битва чекистов с масонами,\n", " Generation П,\n", " Числа,\n", " Лампа Мафусаила, или Крайняя битва чекистов с масонами,\n", " Бэтман Аполло]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup1.find_all('a', {'class':'name'})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "С помощью списковых включений выберем из ссылок с тэгом `` текст (так мы уже делали, и не раз)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "books1 = [b.text for b in soup1.find_all('a', {'class':'name'})]" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Четверо',\n", " 'iPhuck 10',\n", " 'Чапаев и Пустота',\n", " 'Священная книга оборотня',\n", " 'S.N.U.F.F.',\n", " 'Лампа Мафусаила, или Крайняя битва чекистов с масонами',\n", " 'Generation П',\n", " 'Числа',\n", " 'Лампа Мафусаила, или Крайняя битва чекистов с масонами',\n", " 'Бэтман Аполло']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "books1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь аналогичным образом сгрузим информацию о наличии книг:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "instore1 = [s.text for s in soup1.find_all('div', {'class':'title_data green'})]" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ',\n", " '\\n В наличии\\n ']" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instore1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Уберем лишнее:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "instore1 = [i.strip() for i in instore1] # убираем лишние пробелы" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии',\n", " 'В наличии']" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instore1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сгрузим расположение:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "place1 = [p.text for p in soup1.find_all('div', {'class':'placement'})]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Расположение в торговом зале: Уровень 2, зал № 12, секция 02, шкаф 19, полка 36',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 04',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05',\n", " 'Расположение в торговом зале: Уровень 2, зал № 12, секция 07, шкаф 70, полка 05']" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "place1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И, конечно, цену:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "price1 = [p.text for p in soup1.find_all('div', {'class':'title_data price'})]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Цена: 409,00 руб.',\n", " 'Цена: 279,00 руб.',\n", " 'Цена: 269,00 руб.',\n", " 'Цена: 189,00 руб.',\n", " 'Цена: 269,00 руб.',\n", " 'Цена: 739,00 руб.',\n", " 'Цена: 269,00 руб.',\n", " 'Цена: 149,00 руб.',\n", " 'Цена: 269,00 руб.',\n", " 'Цена: 209,00 руб.']" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "price1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось пройтись по всем страницам, которые были выданы в результате поиска. Для примера перейдем на страницу 2 и на этом остановимся." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "next_p = br.find_element_by_css_selector('.next_page')" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "next_p.click()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проделаем то же самое, что и с первой страницей. По-хорошему нужно написать функцию, которая будет искать на странице названия книг, их расположение и цену. Но оставим это в качестве задания читателю :)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "page2 = br.page_source\n", "soup2 = BeautifulSoup(page2, 'lxml')\n", "books2 = [b.text for b in soup2.find_all('a', {'class':'name'})]\n", "instore2 = [s.text for s in soup2.find_all('div', {'class':'title_data green'})]\n", "instore2 = [i.strip() for i in instore2] \n", "place2 = [p.text for p in soup2.find_all('div', {'class':'placement'})]\n", "price2 = [p.text for p in soup2.find_all('div', {'class':'title_data price'})]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Расширим списки результатов с первой страницы данными, полученными со второй страницы, используя метод `.extend()`." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "books1.extend(books2)\n", "instore1.extend(instore2)\n", "place1.extend(place2)\n", "price1.extend(price2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось импортировать библиотеку `pandas` и создать датафрейм." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для разнообразия создадим датафрейм не из списка списков, а из словаря. Ключами словаря будут названия столбцов в таблице, а значениями – списки с сохраненной информацией (названия книг, цены и проч.)." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({'books': books1, 'in_store': instore1, \n", " 'placement': place1, 'price': price1})" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
booksin_storeplacementprice
0ЧетвероВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 409,00 руб.
1iPhuck 10В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 279,00 руб.
2Чапаев и ПустотаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.
3Священная книга оборотняВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 189,00 руб.
4S.N.U.F.F.В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.
\n", "
" ], "text/plain": [ " books in_store \\\n", "0 Четверо В наличии \n", "1 iPhuck 10 В наличии \n", "2 Чапаев и Пустота В наличии \n", "3 Священная книга оборотня В наличии \n", "4 S.N.U.F.F. В наличии \n", "\n", " placement price \n", "0 Расположение в торговом зале: Уровень 2, зал №... Цена: 409,00 руб. \n", "1 Расположение в торговом зале: Уровень 2, зал №... Цена: 279,00 руб. \n", "2 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "3 Расположение в торговом зале: Уровень 2, зал №... Цена: 189,00 руб. \n", "4 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. " ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте приведем столбец с ценой к числовому типу. Уберем слова *Цена* и *руб*, а потом сконвертируем строки в числа с плавающей точкой. Напишем функцию `get_price()`," ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "def get_price(price):\n", " book_price = price.split(' ')[1] # разобьем строку по пробелу и возьмем второй элемент\n", " book_price = book_price.replace(',', '.') # заменим запятую на точку\n", " price_num = float(book_price) # сконвертируем в float\n", " return price_num" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "409.0" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# проверка\n", "get_price(df.price[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Всё отлично работает! Применим функцию к столбцу *price* и создадим новый столбец *nprice*." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "df['nprice'] = df.price.apply(get_price)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
booksin_storeplacementpricenprice
0ЧетвероВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 409,00 руб.409.0
1iPhuck 10В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 279,00 руб.279.0
2Чапаев и ПустотаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
3Священная книга оборотняВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 189,00 руб.189.0
4S.N.U.F.F.В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
\n", "
" ], "text/plain": [ " books in_store \\\n", "0 Четверо В наличии \n", "1 iPhuck 10 В наличии \n", "2 Чапаев и Пустота В наличии \n", "3 Священная книга оборотня В наличии \n", "4 S.N.U.F.F. В наличии \n", "\n", " placement price \\\n", "0 Расположение в торговом зале: Уровень 2, зал №... Цена: 409,00 руб. \n", "1 Расположение в торговом зале: Уровень 2, зал №... Цена: 279,00 руб. \n", "2 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "3 Расположение в торговом зале: Уровень 2, зал №... Цена: 189,00 руб. \n", "4 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "\n", " nprice \n", "0 409.0 \n", "1 279.0 \n", "2 269.0 \n", "3 189.0 \n", "4 269.0 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь можем расположить книги по цене в порядке возрастания:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
booksin_storeplacementpricenprice
7ЧислаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 149,00 руб.149.0
14П 5В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 159,00 руб.159.0
10Жизнь насекомыхВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 159,00 руб.159.0
13Generation \"П\"В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 179,00 руб.179.0
3Священная книга оборотняВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 189,00 руб.189.0
9Бэтман АполлоВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 209,00 руб.209.0
17Бэтман АполлоВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 219,00 руб.219.0
18TВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 259,00 руб.259.0
19Любовь к трем цукербринамВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 259,00 руб.259.0
6Generation ПВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
11Жизнь насекомыхВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
12Омон РаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
4S.N.U.F.F.В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
2Чапаев и ПустотаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
8Лампа Мафусаила, или Крайняя битва чекистов с ...В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
1iPhuck 10В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 279,00 руб.279.0
16Generation \"П\"В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 389,00 руб.389.0
0ЧетвероВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 409,00 руб.409.0
15Чапаев и ПустотаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 519,00 руб.519.0
5Лампа Мафусаила, или Крайняя битва чекистов с ...В наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 739,00 руб.739.0
\n", "
" ], "text/plain": [ " books in_store \\\n", "7 Числа В наличии \n", "14 П 5 В наличии \n", "10 Жизнь насекомых В наличии \n", "13 Generation \"П\" В наличии \n", "3 Священная книга оборотня В наличии \n", "9 Бэтман Аполло В наличии \n", "17 Бэтман Аполло В наличии \n", "18 T В наличии \n", "19 Любовь к трем цукербринам В наличии \n", "6 Generation П В наличии \n", "11 Жизнь насекомых В наличии \n", "12 Омон Ра В наличии \n", "4 S.N.U.F.F. В наличии \n", "2 Чапаев и Пустота В наличии \n", "8 Лампа Мафусаила, или Крайняя битва чекистов с ... В наличии \n", "1 iPhuck 10 В наличии \n", "16 Generation \"П\" В наличии \n", "0 Четверо В наличии \n", "15 Чапаев и Пустота В наличии \n", "5 Лампа Мафусаила, или Крайняя битва чекистов с ... В наличии \n", "\n", " placement price \\\n", "7 Расположение в торговом зале: Уровень 2, зал №... Цена: 149,00 руб. \n", "14 Расположение в торговом зале: Уровень 2, зал №... Цена: 159,00 руб. \n", "10 Расположение в торговом зале: Уровень 2, зал №... Цена: 159,00 руб. \n", "13 Расположение в торговом зале: Уровень 2, зал №... Цена: 179,00 руб. \n", "3 Расположение в торговом зале: Уровень 2, зал №... Цена: 189,00 руб. \n", "9 Расположение в торговом зале: Уровень 2, зал №... Цена: 209,00 руб. \n", "17 Расположение в торговом зале: Уровень 2, зал №... Цена: 219,00 руб. \n", "18 Расположение в торговом зале: Уровень 2, зал №... Цена: 259,00 руб. \n", "19 Расположение в торговом зале: Уровень 2, зал №... Цена: 259,00 руб. \n", "6 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "11 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "12 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "4 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "2 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "8 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "1 Расположение в торговом зале: Уровень 2, зал №... Цена: 279,00 руб. \n", "16 Расположение в торговом зале: Уровень 2, зал №... Цена: 389,00 руб. \n", "0 Расположение в торговом зале: Уровень 2, зал №... Цена: 409,00 руб. \n", "15 Расположение в торговом зале: Уровень 2, зал №... Цена: 519,00 руб. \n", "5 Расположение в торговом зале: Уровень 2, зал №... Цена: 739,00 руб. \n", "\n", " nprice \n", "7 149.0 \n", "14 159.0 \n", "10 159.0 \n", "13 179.0 \n", "3 189.0 \n", "9 209.0 \n", "17 219.0 \n", "18 259.0 \n", "19 259.0 \n", "6 269.0 \n", "11 269.0 \n", "12 269.0 \n", "4 269.0 \n", "2 269.0 \n", "8 269.0 \n", "1 279.0 \n", "16 389.0 \n", "0 409.0 \n", "15 519.0 \n", "5 739.0 " ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values('nprice')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выберем какую-нибудь книгу:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
booksin_storeplacementpricenprice
2Чапаев и ПустотаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 269,00 руб.269.0
15Чапаев и ПустотаВ наличииРасположение в торговом зале: Уровень 2, зал №...Цена: 519,00 руб.519.0
\n", "
" ], "text/plain": [ " books in_store \\\n", "2 Чапаев и Пустота В наличии \n", "15 Чапаев и Пустота В наличии \n", "\n", " placement price \\\n", "2 Расположение в торговом зале: Уровень 2, зал №... Цена: 269,00 руб. \n", "15 Расположение в торговом зале: Уровень 2, зал №... Цена: 519,00 руб. \n", "\n", " nprice \n", "2 269.0 \n", "15 519.0 " ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.books == \"Чапаев и Пустота\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И сохраним всю таблицу в csv-файл:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df.to_csv(\"books.csv\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }