{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Основы программирования в Python\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Посмотрим на другие примеры использования `selenium`. \n", "\n", "**Пример.** Зайдем на сайт книжного магазина и найдем все книги про Python. Загрузим библиотеку, веб-драйвер и откроем страницу в браузере через 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 = \"Python\" # переменная author - условность" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Введем запрос в поле для поиска (`.send_keys`) и подождем чуть-чуть:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "field.send_keys(author)\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": [ "[Python : Карманный справочник,\n", " Python : создаем программы и игры,,\n", " Изучаем Python,\n", " Python 3 Самое необходимое ,\n", " Простой Python просто с нуля,\n", " Python и машинное обучение: машинное и глубокое обучение с использованием Python, scikit-learn и TenFlow,\n", " Алгоритмы. Справочник с примерами на C, C++, Java и Python,\n", " Python 3 и PyQt 5. Разработка приложений,\n", " Практикум по математической статистике. Проверка гипотез с использованием Excel, MatCalc, R и Python,\n", " Django 2.1. Практика создания веб-сайтов на Python]" ] }, "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": [ "['Python : Карманный справочник',\n", " 'Python : создаем программы и игры,',\n", " 'Изучаем Python',\n", " 'Python 3 Самое необходимое ',\n", " 'Простой Python просто с нуля',\n", " 'Python и машинное обучение: машинное и глубокое обучение с использованием Python, scikit-learn и TenFlow',\n", " 'Алгоритмы. Справочник с примерами на C, C++, Java и Python',\n", " 'Python 3 и PyQt 5. Разработка приложений',\n", " 'Практикум по математической статистике. Проверка гипотез с использованием Excel, MatCalc, R и Python',\n", " 'Django 2.1. Практика создания веб-сайтов на Python']" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "books1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь аналогичным образом сгрузим информацию об авторах:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "authors1 = [a.text for a in soup1.find_all('div', {'class': 'author'})]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сгрузим расположение:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "place1 = [p.text for p in soup1.find_all('div', {'class':'placement'})]" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 04',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 06',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 05',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 06',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 05',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 06, шкаф 58, полка 01',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 06, шкаф 60, полка 08',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 04',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 65, полка 06',\n", " 'Расположение в торговом зале: Уровень 1, зал № 07, секция 07, шкаф 72, полка 07']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "place1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И, конечно, цену:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "price1 = [p.text for p in soup1.find_all('div', \n", " {'class':'title_data price'})]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Цена: 569,00 руб.',\n", " 'Цена: 469,00 руб.',\n", " 'Цена: 3659,00 руб.',\n", " 'Цена: 899,00 руб.',\n", " 'Цена: 819,00 руб.',\n", " 'Цена: 2349,00 руб.',\n", " 'Цена: 1409,00 руб.',\n", " 'Цена: 1239,00 руб.',\n", " 'Цена: 249,00 руб.',\n", " 'Цена: 1109,00 руб.']" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "price1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось пройтись по всем страницам, которые были выданы в результате поиска. Для примера перейдем на страницу 2 и на этом остановимся." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "next_p = br.find_element_by_css_selector('.next_page')" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "next_p.click()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Проделаем то же самое, что и с первой страницей. По-хорошему нужно написать функцию, которая будет искать на странице названия книг, их расположение и цену. Но оставим это в качестве задания читателю :)" ] }, { "cell_type": "code", "execution_count": 22, "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", "author2 = [a.text for a in soup2.find_all('div', {'class': 'author'})]\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": 23, "metadata": {}, "outputs": [], "source": [ "books1.extend(books2)\n", "authors1.extend(books2)\n", "place1.extend(place2)\n", "price1.extend(price2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось импортировать библиотеку `pandas` и создать датафрейм." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для разнообразия создадим датафрейм не из списка списков, а из словаря. Ключами словаря будут названия столбцов в таблице, а значениями – списки с сохраненной информацией (названия книг, цены и проч.)." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({'book': books1, 'author': authors1,\n", " 'placement': place1, 'price': price1})" ] }, { "cell_type": "code", "execution_count": 26, "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", "
bookauthorplacementprice
0Python : Карманный справочникМ. ЛутцРасположение в торговом зале: Уровень 1, зал №...Цена: 569,00 руб.
1Python : создаем программы и игры,Д. М. КольцовРасположение в торговом зале: Уровень 1, зал №...Цена: 469,00 руб.
2Изучаем PythonМ. ЛутцРасположение в торговом зале: Уровень 1, зал №...Цена: 3659,00 руб.
3Python 3 Самое необходимоеПрохоренокРасположение в торговом зале: Уровень 1, зал №...Цена: 899,00 руб.
4Простой Python просто с нуляР. ГаскоРасположение в торговом зале: Уровень 1, зал №...Цена: 819,00 руб.
\n", "
" ], "text/plain": [ " book author \\\n", "0 Python : Карманный справочник М. Лутц \n", "1 Python : создаем программы и игры, Д. М. Кольцов \n", "2 Изучаем Python М. Лутц \n", "3 Python 3 Самое необходимое Прохоренок \n", "4 Простой Python просто с нуля Р. Гаско \n", "\n", " placement price \n", "0 Расположение в торговом зале: Уровень 1, зал №... Цена: 569,00 руб. \n", "1 Расположение в торговом зале: Уровень 1, зал №... Цена: 469,00 руб. \n", "2 Расположение в торговом зале: Уровень 1, зал №... Цена: 3659,00 руб. \n", "3 Расположение в торговом зале: Уровень 1, зал №... Цена: 899,00 руб. \n", "4 Расположение в торговом зале: Уровень 1, зал №... Цена: 819,00 руб. " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте приведем столбец с ценой к числовому типу. Уберем слова *Цена* и *руб*, а потом сконвертируем строки в числа с плавающей точкой. Напишем функцию `get_price()`," ] }, { "cell_type": "code", "execution_count": 27, "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": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "569.0" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# проверка\n", "get_price(df.price[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Всё отлично работает! Применим функцию к столбцу *price* и создадим новый столбец *nprice*." ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "df['nprice'] = df.price.apply(get_price)" ] }, { "cell_type": "code", "execution_count": 31, "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", "
bookauthorplacementpricenprice
0Python : Карманный справочникМ. ЛутцРасположение в торговом зале: Уровень 1, зал №...Цена: 569,00 руб.569.0
1Python : создаем программы и игры,Д. М. КольцовРасположение в торговом зале: Уровень 1, зал №...Цена: 469,00 руб.469.0
2Изучаем PythonМ. ЛутцРасположение в торговом зале: Уровень 1, зал №...Цена: 3659,00 руб.3659.0
3Python 3 Самое необходимоеПрохоренокРасположение в торговом зале: Уровень 1, зал №...Цена: 899,00 руб.899.0
4Простой Python просто с нуляР. ГаскоРасположение в торговом зале: Уровень 1, зал №...Цена: 819,00 руб.819.0
\n", "
" ], "text/plain": [ " book author \\\n", "0 Python : Карманный справочник М. Лутц \n", "1 Python : создаем программы и игры, Д. М. Кольцов \n", "2 Изучаем Python М. Лутц \n", "3 Python 3 Самое необходимое Прохоренок \n", "4 Простой Python просто с нуля Р. Гаско \n", "\n", " placement price \\\n", "0 Расположение в торговом зале: Уровень 1, зал №... Цена: 569,00 руб. \n", "1 Расположение в торговом зале: Уровень 1, зал №... Цена: 469,00 руб. \n", "2 Расположение в торговом зале: Уровень 1, зал №... Цена: 3659,00 руб. \n", "3 Расположение в торговом зале: Уровень 1, зал №... Цена: 899,00 руб. \n", "4 Расположение в торговом зале: Уровень 1, зал №... Цена: 819,00 руб. \n", "\n", " nprice \n", "0 569.0 \n", "1 469.0 \n", "2 3659.0 \n", "3 899.0 \n", "4 819.0 " ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь можем расположить книги по цене в порядке возрастания:" ] }, { "cell_type": "code", "execution_count": 32, "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", "
bookauthorplacementpricenprice
8Практикум по математической статистике. Провер...В. И. Глебов, С. Я. КриволаповРасположение в торговом зале: Уровень 1, зал №...Цена: 249,00 руб.249.0
1Python : создаем программы и игры,Д. М. КольцовРасположение в торговом зале: Уровень 1, зал №...Цена: 469,00 руб.469.0
0Python : Карманный справочникМ. ЛутцРасположение в торговом зале: Уровень 1, зал №...Цена: 569,00 руб.569.0
4Простой Python просто с нуляР. ГаскоРасположение в торговом зале: Уровень 1, зал №...Цена: 819,00 руб.819.0
3Python 3 Самое необходимоеПрохоренокРасположение в торговом зале: Уровень 1, зал №...Цена: 899,00 руб.899.0
10Python. Экспресс-курсPython. Экспресс-курсРасположение в торговом зале: Уровень 1, зал №...Цена: 989,00 руб.989.0
11Глубокое обучение на PythonГлубокое обучение на PythonРасположение в торговом зале: Уровень 1, зал №...Цена: 1039,00 руб.1039.0
9Django 2.1. Практика создания веб-сайтов на Py...В. А. ДроновРасположение в торговом зале: Уровень 1, зал №...Цена: 1109,00 руб.1109.0
7Python 3 и PyQt 5. Разработка приложенийН. А. Прохоренок, В. ДроновРасположение в торговом зале: Уровень 1, зал №...Цена: 1239,00 руб.1239.0
18Скрапинг веб-сайтов с помощью Python : сбор да...Скрапинг веб-сайтов с помощью Python : сбор да...Расположение в торговом зале: Уровень 1, зал №...Цена: 1279,00 руб.1279.0
6Алгоритмы. Справочник с примерами на C, C++, J...Дж. Хайнеман, Г. Поллис, С. СелковРасположение в торговом зале: Уровень 1, зал №...Цена: 1409,00 руб.1409.0
15Искусственный интеллект с примерами на PythonИскусственный интеллект с примерами на PythonРасположение в торговом зале: Уровень 1, зал №...Цена: 1409,00 руб.1409.0
19Python для сложных задач: наука о данных и маш...Python для сложных задач: наука о данных и маш...Расположение в торговом зале: Уровень 1, зал №...Цена: 1409,00 руб.1409.0
13Программирование на языке PythonПрограммирование на языке PythonРасположение в торговом зале: Уровень 1, зал №...Цена: 1879,00 руб.1879.0
17Python. К вершинам мастерстваPython. К вершинам мастерстваРасположение в торговом зале: Уровень 1, зал №...Цена: 1969,00 руб.1969.0
16Программирование на Python 3Программирование на Python 3Расположение в торговом зале: Уровень 1, зал №...Цена: 2269,00 руб.2269.0
5Python и машинное обучение: машинное и глубоко...С. Рашка, В. МирджалилиРасположение в торговом зале: Уровень 1, зал №...Цена: 2349,00 руб.2349.0
14Python. Справочник. Полное описание языкаPython. Справочник. Полное описание языкаРасположение в торговом зале: Уровень 1, зал №...Цена: 2349,00 руб.2349.0
12Программирование на Python. Т. 1Программирование на Python. Т. 1Расположение в торговом зале: Уровень 1, зал №...Цена: 2779,00 руб.2779.0
2Изучаем PythonМ. ЛутцРасположение в торговом зале: Уровень 1, зал №...Цена: 3659,00 руб.3659.0
\n", "
" ], "text/plain": [ " book \\\n", "8 Практикум по математической статистике. Провер... \n", "1 Python : создаем программы и игры, \n", "0 Python : Карманный справочник \n", "4 Простой Python просто с нуля \n", "3 Python 3 Самое необходимое \n", "10 Python. Экспресс-курс \n", "11 Глубокое обучение на Python \n", "9 Django 2.1. Практика создания веб-сайтов на Py... \n", "7 Python 3 и PyQt 5. Разработка приложений \n", "18 Скрапинг веб-сайтов с помощью Python : сбор да... \n", "6 Алгоритмы. Справочник с примерами на C, C++, J... \n", "15 Искусственный интеллект с примерами на Python \n", "19 Python для сложных задач: наука о данных и маш... \n", "13 Программирование на языке Python \n", "17 Python. К вершинам мастерства \n", "16 Программирование на Python 3 \n", "5 Python и машинное обучение: машинное и глубоко... \n", "14 Python. Справочник. Полное описание языка \n", "12 Программирование на Python. Т. 1 \n", "2 Изучаем Python \n", "\n", " author \\\n", "8 В. И. Глебов, С. Я. Криволапов \n", "1 Д. М. Кольцов \n", "0 М. Лутц \n", "4 Р. Гаско \n", "3 Прохоренок \n", "10 Python. Экспресс-курс \n", "11 Глубокое обучение на Python \n", "9 В. А. Дронов \n", "7 Н. А. Прохоренок, В. Дронов \n", "18 Скрапинг веб-сайтов с помощью Python : сбор да... \n", "6 Дж. Хайнеман, Г. Поллис, С. Селков \n", "15 Искусственный интеллект с примерами на Python \n", "19 Python для сложных задач: наука о данных и маш... \n", "13 Программирование на языке Python \n", "17 Python. К вершинам мастерства \n", "16 Программирование на Python 3 \n", "5 С. Рашка, В. Мирджалили \n", "14 Python. Справочник. Полное описание языка \n", "12 Программирование на Python. Т. 1 \n", "2 М. Лутц \n", "\n", " placement price \\\n", "8 Расположение в торговом зале: Уровень 1, зал №... Цена: 249,00 руб. \n", "1 Расположение в торговом зале: Уровень 1, зал №... Цена: 469,00 руб. \n", "0 Расположение в торговом зале: Уровень 1, зал №... Цена: 569,00 руб. \n", "4 Расположение в торговом зале: Уровень 1, зал №... Цена: 819,00 руб. \n", "3 Расположение в торговом зале: Уровень 1, зал №... Цена: 899,00 руб. \n", "10 Расположение в торговом зале: Уровень 1, зал №... Цена: 989,00 руб. \n", "11 Расположение в торговом зале: Уровень 1, зал №... Цена: 1039,00 руб. \n", "9 Расположение в торговом зале: Уровень 1, зал №... Цена: 1109,00 руб. \n", "7 Расположение в торговом зале: Уровень 1, зал №... Цена: 1239,00 руб. \n", "18 Расположение в торговом зале: Уровень 1, зал №... Цена: 1279,00 руб. \n", "6 Расположение в торговом зале: Уровень 1, зал №... Цена: 1409,00 руб. \n", "15 Расположение в торговом зале: Уровень 1, зал №... Цена: 1409,00 руб. \n", "19 Расположение в торговом зале: Уровень 1, зал №... Цена: 1409,00 руб. \n", "13 Расположение в торговом зале: Уровень 1, зал №... Цена: 1879,00 руб. \n", "17 Расположение в торговом зале: Уровень 1, зал №... Цена: 1969,00 руб. \n", "16 Расположение в торговом зале: Уровень 1, зал №... Цена: 2269,00 руб. \n", "5 Расположение в торговом зале: Уровень 1, зал №... Цена: 2349,00 руб. \n", "14 Расположение в торговом зале: Уровень 1, зал №... Цена: 2349,00 руб. \n", "12 Расположение в торговом зале: Уровень 1, зал №... Цена: 2779,00 руб. \n", "2 Расположение в торговом зале: Уровень 1, зал №... Цена: 3659,00 руб. \n", "\n", " nprice \n", "8 249.0 \n", "1 469.0 \n", "0 569.0 \n", "4 819.0 \n", "3 899.0 \n", "10 989.0 \n", "11 1039.0 \n", "9 1109.0 \n", "7 1239.0 \n", "18 1279.0 \n", "6 1409.0 \n", "15 1409.0 \n", "19 1409.0 \n", "13 1879.0 \n", "17 1969.0 \n", "16 2269.0 \n", "5 2349.0 \n", "14 2349.0 \n", "12 2779.0 \n", "2 3659.0 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values('nprice')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И сохраним всю таблицу в csv-файл:" ] }, { "cell_type": "code", "execution_count": null, "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 }