{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python для сбора данных\n", "\n", "*Алла Тамбовцева, НИУ ВШЭ*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Web-scraping\n", "\n", "Мы уже немного познакомились со структурой html-файлов, теперь попробуем выгрузить информацию из реальной страницы, а точнее, с реального сайта [nplus1.ru](https://nplus1.ru/).\n", "\n", "**Наша задача:** выгрузить недавние новости в датафрейм `pandas`, чтобы потом сохранить все в csv-файл.\n", "\n", "Сначала сгрузим весь html-код страницы и сохраним его в отдельную переменную. Для этого нам понадобится библиотека `requests`. Импортируем её:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import requests" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Сохраним ссылку на главную страницу сайта в переменную `url` для удобства и выгрузим страницу. (Разумеется, это будет работать при подключении к интернету. Если соединение будет отключено, Python выдаст `NewConnectionError`)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "url = 'https://nplus1.ru/' # сохраняем\n", "page = requests.get(url) # загружаем страницу по ссылке" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если мы просто посмотрим на объект, мы ничего особенного не увидим:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "page # response 200 - страница загружена" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем функцию `BeautifulSoup` из библиотеки `bs4` (от *beautifulsoup4*) и заберём со страницы `page` код html в виде текста. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from bs4 import BeautifulSoup # не спрашивайте, почему BeautifulSoup" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "soup = BeautifulSoup(page.text, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если выведем `soup` на экран, мы увидим то же самое, что в режиме разработчика или в режиме происмотра исходного кода (`view-source` через *Ctrl+U* в Google Chrome)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "soup" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Для просмотра выглядит не очень удобно.  «Причешем» наш `soup` – воспользуемся методом `.prettify()` в сочетании с функцией `print()`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(soup.prettify())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В такой выдаче ориентироваться гораздо удобнее (но при желании, то же можно увидеть в браузере, на большом экране)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Чтобы сгрузить все новости с главной страницы сайта, нужно собрать все ссылки на страницы с этими новостями. Ссылки в html-файле всегда заключены в тэг `` и имеют атрибут `href`. Посмотрим на кусочки кода, соответствующие всем ссылкам на главной странице сайта:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#\n", "/\n", "#\n", "#\n", "/rubric/astronomy\n", "/rubric/physics\n", "/rubric/biology\n", "/rubric/robots-drones\n", "/theme/oops\n", "/theme/economy-literature\n", "/theme/hayabusa\n", "/theme/art-of-integration\n", "/\n", "#\n", "/rubric/astronomy\n", "/rubric/physics\n", "/rubric/biology\n", "/rubric/robots-drones\n", "#\n", "/theme/oops\n", "/theme/economy-literature\n", "/theme/hayabusa\n", "/theme/art-of-integration\n", "https://nplus1.ru/blog/2019/04/03/adventures-in-the-anthropocene\n", "https://nplus1.ru/blog/2019/04/03/adventures-in-the-anthropocene\n", "https://nplus1.ru/blog/2019/04/02/pompeii-thermopolium\n", "https://nplus1.ru/blog/2019/03/29/the-revolutionary-genius-of-plants\n", "https://nplus1.ru/blog/2019/03/28/what-about-labioldentals\n", "https://nplus1.ru/blog/2019/03/27/five-years-deadline\n", "https://nplus1.ru/blog/2019/03/26/limb-183\n", "https://nplus1.ru/blog/2019/03/25/ben-franklin-effect\n", "https://nplus1.ru/blog/2019/03/22/a-history-of-private-life\n", "https://nplus1.ru/blog/2019/03/22/spanish-princess\n", "https://nplus1.ru/blog/2019/04/09/game-of-thrones-psychology\n", "/news/2019/04/09/ligo-03\n", "/news/2019/04/09/fecal-transplant-v-asd\n", "/news/2019/04/09/auroras-in-Jupiter\n", "/news/2019/04/09/big-Jupiter-in-binary\n", "/news/2019/04/09/iron-volcanism\n", "/news/2019/04/09/edge-chromium-dev\n", "/news/2019/04/09/walking-on-stress-biomarkes\n", "/material/2019/04/09/state-information-system\n", "/rubric/partners\n", "/theme/art-of-integration\n", "/news/2019/04/09/robot\n", "/news/2019/04/09/wing-approval\n", "/news/2019/04/09/brain-sync-in-elderly\n", "/news/2019/04/09/drones\n", "/news/2019/04/09/psychology-replication\n", "/news/2019/04/09/rocket-lab\n", "/blog/2019/04/03/adventures-in-the-anthropocene\n", "/blog/2019/04/09/game-of-thrones-psychology\n", "/news/2019/04/08/myths\n", "/rubric/partners\n", "/material/2019/04/05/eminence-grise\n", "/rubric/partners\n", "/news/2019/04/09/jpals\n", "/news/2019/04/08/peanuts\n", "/news/2019/04/08/digital-beowulf-authorship\n", "/news/2019/04/08/guinnes-bubbles\n", "/news/2019/04/08/robotic-arm\n", "/news/2019/04/08/pyroclastic-flow\n", "/blog/2019/03/29/the-revolutionary-genius-of-plants\n", "/blog/2019/04/02/pompeii-thermopolium\n", "/material/2019/04/07/black-hole-photo\n", "/rubric/astronomy\n", "/material/2019/04/04/animals-vegs\n", "/rubric/biology\n", "/material/2019/04/05/eminence-grise\n", "/news/2019/04/03/bose-fermi-soliton\n", "/news/2019/04/02/phase-language\n", "/news/2019/04/05/electrolyte-conductivity\n", "/news/2019/04/08/guinnes-bubbles\n", "/news/2019/04/08/myths\n", "/news/2019/04/08/tidal-signal\n", "/news/2019/04/02/china-atom-laser-gravitational-antenna\n", "/news/2019/04/09/iron-volcanism\n", "/news/2019/04/08/peanuts\n", "https://nplus1.ru/blog/2019/04/03/adventures-in-the-anthropocene\n", "https://nplus1.ru/blog/2019/04/03/adventures-in-the-anthropocene\n", "https://nplus1.ru/blog/2019/04/02/pompeii-thermopolium\n", "https://nplus1.ru/blog/2019/03/29/the-revolutionary-genius-of-plants\n", "https://nplus1.ru/blog/2019/03/28/what-about-labioldentals\n", "https://nplus1.ru/blog/2019/03/27/five-years-deadline\n", "https://nplus1.ru/blog/2019/03/26/limb-183\n", "https://nplus1.ru/blog/2019/03/25/ben-franklin-effect\n", "https://nplus1.ru/blog/2019/03/22/a-history-of-private-life\n", "https://nplus1.ru/blog/2019/03/22/spanish-princess\n", "https://nplus1.ru/blog/2019/04/09/game-of-thrones-psychology\n", "/\n", "/about\n", "/adv\n", "/rules\n", "/vacancy\n", "/difficult\n", "https://nplus1.ru/personal-data-policy\n", "#\n", "https://t.me/nplusone\n", "http://vk.com/nplusone\n", "https://www.facebook.com/nplusone\n", "https://twitter.com/nplusodin\n", "https://ok.ru/nplus1\n", "https://soundcloud.com/nplus_1\n", "/rss\n" ] } ], "source": [ "for link in soup.find_all('a'):\n", " print(link.get('href'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ссылок много. Но нам нужны только новости – ссылки, которые начинаются со слова `/news`. Добавим условие: будем выбирать только те ссылки, в которых есть `/news`. Создадим пустой список `urls` и будем добавлять в него только ссылки, которые удовлетворяют этому условию." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['/news/2019/04/09/ligo-03',\n", " '/news/2019/04/09/fecal-transplant-v-asd',\n", " '/news/2019/04/09/auroras-in-Jupiter',\n", " '/news/2019/04/09/big-Jupiter-in-binary',\n", " '/news/2019/04/09/iron-volcanism',\n", " '/news/2019/04/09/edge-chromium-dev',\n", " '/news/2019/04/09/walking-on-stress-biomarkes',\n", " '/news/2019/04/09/robot',\n", " '/news/2019/04/09/wing-approval',\n", " '/news/2019/04/09/brain-sync-in-elderly',\n", " '/news/2019/04/09/drones',\n", " '/news/2019/04/09/psychology-replication',\n", " '/news/2019/04/09/rocket-lab',\n", " '/news/2019/04/08/myths',\n", " '/news/2019/04/09/jpals',\n", " '/news/2019/04/08/peanuts',\n", " '/news/2019/04/08/digital-beowulf-authorship',\n", " '/news/2019/04/08/guinnes-bubbles',\n", " '/news/2019/04/08/robotic-arm',\n", " '/news/2019/04/08/pyroclastic-flow',\n", " '/news/2019/04/03/bose-fermi-soliton',\n", " '/news/2019/04/02/phase-language',\n", " '/news/2019/04/05/electrolyte-conductivity',\n", " '/news/2019/04/08/guinnes-bubbles',\n", " '/news/2019/04/08/myths',\n", " '/news/2019/04/08/tidal-signal',\n", " '/news/2019/04/02/china-atom-laser-gravitational-antenna',\n", " '/news/2019/04/09/iron-volcanism',\n", " '/news/2019/04/08/peanuts']" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "urls = []\n", "\n", "for link in soup.find_all('a'):\n", " if '/news' in link.get('href'):\n", " urls.append(link.get('href'))\n", "urls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ссылки, которые у нас есть в списке `urls`, относительные: они неполные, начало ссылки (название сайта) отсутствует. Давайте превратим их в абсолютные — склеим с ссылкой https://nplus1.ru." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['https://nplus1.ru/news/2019/04/09/ligo-03',\n", " 'https://nplus1.ru/news/2019/04/09/fecal-transplant-v-asd',\n", " 'https://nplus1.ru/news/2019/04/09/auroras-in-Jupiter',\n", " 'https://nplus1.ru/news/2019/04/09/big-Jupiter-in-binary',\n", " 'https://nplus1.ru/news/2019/04/09/iron-volcanism',\n", " 'https://nplus1.ru/news/2019/04/09/edge-chromium-dev',\n", " 'https://nplus1.ru/news/2019/04/09/walking-on-stress-biomarkes',\n", " 'https://nplus1.ru/news/2019/04/09/robot',\n", " 'https://nplus1.ru/news/2019/04/09/wing-approval',\n", " 'https://nplus1.ru/news/2019/04/09/brain-sync-in-elderly',\n", " 'https://nplus1.ru/news/2019/04/09/drones',\n", " 'https://nplus1.ru/news/2019/04/09/psychology-replication',\n", " 'https://nplus1.ru/news/2019/04/09/rocket-lab',\n", " 'https://nplus1.ru/news/2019/04/08/myths',\n", " 'https://nplus1.ru/news/2019/04/09/jpals',\n", " 'https://nplus1.ru/news/2019/04/08/peanuts',\n", " 'https://nplus1.ru/news/2019/04/08/digital-beowulf-authorship',\n", " 'https://nplus1.ru/news/2019/04/08/guinnes-bubbles',\n", " 'https://nplus1.ru/news/2019/04/08/robotic-arm',\n", " 'https://nplus1.ru/news/2019/04/08/pyroclastic-flow',\n", " 'https://nplus1.ru/news/2019/04/03/bose-fermi-soliton',\n", " 'https://nplus1.ru/news/2019/04/02/phase-language',\n", " 'https://nplus1.ru/news/2019/04/05/electrolyte-conductivity',\n", " 'https://nplus1.ru/news/2019/04/08/guinnes-bubbles',\n", " 'https://nplus1.ru/news/2019/04/08/myths',\n", " 'https://nplus1.ru/news/2019/04/08/tidal-signal',\n", " 'https://nplus1.ru/news/2019/04/02/china-atom-laser-gravitational-antenna',\n", " 'https://nplus1.ru/news/2019/04/09/iron-volcanism',\n", " 'https://nplus1.ru/news/2019/04/08/peanuts']" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_urls = []\n", "\n", "for u in urls:\n", " res = 'https://nplus1.ru' + u\n", " full_urls.append(res) \n", "\n", "full_urls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь наша задача сводится к следующему: изучить одну страницу с новостью, научиться из нее вытаскивать текст и всю необходимую информацию, а потом применить весь набор действий к каждой ссылке из `full_urls` в цикле. Посмотрим на новость с индексом 1, у вас может быть другая, новости обновляются." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "url0 = full_urls[1]\n", "\n", "page0 = requests.get(url0)\n", "soup0 = BeautifulSoup(page0.text, 'lxml')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "В коде каждой страницы с новостью есть часть с мета-информацией: датой, именем автора и проч. Такая информация окружена тэгом ``. Посмотрим:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Из этого списка нам нужны части с именем автора, датой, заголовком и кратким описанием. Воспользуемся поиском по атрибуту `name`. Передадим функции `find_all()` в качестве аргумента словарь с названием и значением атрибута: " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'}) # например, автор" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь выберем единственный элемент полученного списка (с индексом 0):" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'})[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Нам нужно вытащить из этого объекта `content` – имя автора. Посмотрим на атрибуты:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'name': 'author', 'content': 'Елизавета Ивтушок'}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('meta', {'name' : 'author'})[0].attrs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Как получить отсюда `content`? Очень просто, ведь это словарь! А доставать из словаря значение по ключу мы умеем." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Елизавета Ивтушок'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "author = soup0.find_all('meta', {'name' : 'author'})[0].attrs['content']\n", "author" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Аналогичным образом извлечем дату, заголовок и описание." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "date = soup0.find_all('meta', {'itemprop' : 'datePublished'})[0].attrs['content']\n", "title = soup0.find_all('meta', {'property' : 'og:title'})[0].attrs['content']\n", "description = soup0.find_all('meta', {'name' : 'description'})[0].attrs['content']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось вытащить рубрики и сложность текста. Если мы посмотрим на исходный код страницы, мы увидим, что нужная нам информация находится в тэгах `

`:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[

\n", " Медицина\n", " Биология\n", "

,

\n", " \n", " \n", " \n", "

,

\n", " \n", " Сложность\n", " 2.8\n", " \n", "

,

Американские ученые опубликовали результаты двухлетнего исследования влияния трансплантированного кишечного микробиома на симптомы расстройства аутистического спектра среди 18 детей. Помимо улучшения работы желудочно-кишечного тракта, которое наблюдалось сразу же после трансплантации в начале исследования, ученые сообщили и о значимых поведенческих улучшениях. Статья опубликована в журнале Scientific Reports.

,

На настоящий момент эффективного средства лечения расстройства аутистического спектра не существует, в лучшем случае можно купировать симптомы с помощью длительной поведенческой терапии (подробнее об этом расстройстве и истории его изучения вы можете прочитать в нашем тексте «Дети дождя»).

,

В январе 2017 года группа ученых под руководством Дае-Вука Канга (Dae-Wook Kang) запустила долгосрочный проект по изучению влияния трансплантации кишечного микробиома здоровых людей на симптомы расстройства аутистического спектра — как желудочно-кишечные, так и поведенческие. В ходе эксперимента участники (всего их было 18 человек) пропили двухнедельный курс антибиотиков и прошли чистку кишечника, после чего им трансплантировали фекальный микробиом здоровых людей — в большом количестве единожды и в качестве ежедневного лечения в течение последующих недель. За время наблюдений у участников улучшились желудочно-кишечные симптомы: пропали запоры, диарея и боль в животе. Сохранение положительных результатов наблюдалось в течение восьми недель, а также улучшились поведенческие симптомы. 

,

В новой работе авторы оригинального исследования сообщили о том, что положительный эффект от терапии сохранился и в течение последующий двух лет после изначального эксперимента. Наиболее значимым и интересным с точки зрения терапии аутизма оказались результаты опроса Childhood Autism Rating Scale (CARS), который указывает на тяжесть симптомов, характерных для расстройства аутистического спектра, у детей. По этой шкале тяжесть симптомов стала на 47 процентов меньше, чем до начала лечения, причем два года назад, сразу после окончания лечения, этот показатель был равен только 23 процентам.

,

,

Изменение симптомов расстройства аутистического спектра (красный — тяжелые, желтый — средней тяжести, синий — легкие) до, сразу после и через два года после проведения трансплантации

,

Dae-Wook Kang et al. / Scientific Reports, 2019

,

Состав кишечного микробиома человека связан не только с состоянием желудочно-кишечного тракта и болезней, которые с ним связаны: исследования показывают, что бактерии человеческого кишечника провоцируют рассеянный склероз, играют свою роль в появлении инсульта, а также связаны с возникновением депрессии и общим качеством жизни человека. Соответственно, предполагается, что трансплантация фекального микробиома может быть либо профилактическим, либо лечебным средством от этих заболеваний и расстройств. Проведенное исследование показывает, что использование микробиома здоровых людей для лечения симптомов расстройства аутистического спектра — метод безопасный и эффективный (по крайней мере в рамках первого пилотного исследования).

,

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

,

Елизавета Ивтушок

,

Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter.

,

Как создавалось программное обеспечение ГИС ЖКХ

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

Коэффициент сложности

,

© 2019 N+1 Интернет-издание   Свидетельство о регистрации СМИ Эл № ФС77-67614

,

Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. \n", " Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются \n", " только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения \n", " и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru

,

Материалы, опубликованные в разделе «Блоги», отражают позиции их авторов, которые могут не совпадать с мнением редакции.

,

Сайт может содержать контент, не предназначенный для лиц младше 18 лет.

,

\n", " Политика обработки персональных данных пользователей сайта\n", "

,

\n", " \n", " Change privacy settings\n", "

,

\n", "

]" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('p')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Выберем из полученного списка первый элемент и найдем в нем все тэги ``:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Медицина,\n", " Биология]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('p')[0].find_all('a')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Получился список. Применим списковые включения – вытащим из каждого элемента (их могло бы быть больше) текст и поместим его в новый список `rubrics`." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Медицина', 'Биология']" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rubrics = [r.text for r in soup0.find_all('p')[0].find_all('a')]\n", "rubrics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталась только сложность. Возьмем соответствующий кусок кода:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[2.8]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "soup0.find_all('span', {'class' : 'difficult-value'})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "И выберем оттуда текст." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2.8'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "diff = soup0.find_all('span', {'class' : 'difficult-value'})[0].text\n", "diff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь перейдем к тексту самой новости. Как можно заметить, текст сохранен в абзацах `

`, причем безо всяких атрибутов. Сообщим Python, что нас интересуют куски с пустым атрибутом `class`:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "text_list = soup0.find_all('p', {'class' : None})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "«Выцепим» все тексты (без тэгов) из полученного списка:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "text = [t.text for t in text_list]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Склеим все элементы списка `text` через пробел:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Американские ученые опубликовали результаты двухлетнего исследования влияния трансплантированного кишечного микробиома на симптомы расстройства аутистического спектра среди 18 детей. Помимо улучшения работы желудочно-кишечного тракта, которое наблюдалось сразу же после трансплантации в начале исследования, ученые сообщили и о значимых поведенческих улучшениях. Статья опубликована в журнале Scientific Reports. На настоящий момент эффективного средства лечения расстройства аутистического спектра не существует, в лучшем случае можно купировать симптомы с помощью длительной поведенческой терапии (подробнее об этом расстройстве и истории его изучения вы можете прочитать в нашем тексте «Дети дождя»). В январе 2017 года группа ученых под руководством Дае-Вука Канга (Dae-Wook Kang) запустила долгосрочный проект по изучению влияния трансплантации кишечного микробиома здоровых людей на симптомы расстройства аутистического спектра — как желудочно-кишечные, так и поведенческие. В ходе эксперимента участники (всего их было 18 человек) пропили двухнедельный курс антибиотиков и прошли чистку кишечника, после чего им трансплантировали фекальный микробиом здоровых людей — в большом количестве единожды и в качестве ежедневного лечения в течение последующих недель. За время наблюдений у участников улучшились желудочно-кишечные симптомы: пропали запоры, диарея и боль в животе. Сохранение положительных результатов наблюдалось в течение восьми недель, а также улучшились поведенческие симптомы.\\xa0 В новой работе авторы оригинального исследования сообщили о том, что положительный эффект от терапии сохранился и в течение последующий двух лет после изначального эксперимента. Наиболее значимым и интересным с точки зрения терапии аутизма оказались результаты опроса Childhood Autism Rating Scale (CARS), который указывает на тяжесть симптомов, характерных для расстройства аутистического спектра, у детей. По этой шкале тяжесть симптомов стала на 47 процентов меньше, чем до начала лечения, причем два года назад, сразу после окончания лечения, этот показатель был равен только 23 процентам. Состав кишечного микробиома человека связан не только с состоянием желудочно-кишечного тракта и болезней, которые с ним связаны: исследования показывают, что бактерии человеческого кишечника провоцируют рассеянный склероз, играют свою роль в появлении инсульта, а также связаны с возникновением депрессии и общим качеством жизни человека. Соответственно, предполагается, что трансплантация фекального микробиома может быть либо профилактическим, либо лечебным средством от этих заболеваний и расстройств. Проведенное исследование показывает, что использование микробиома здоровых людей для лечения симптомов расстройства аутистического спектра — метод безопасный и эффективный (по крайней мере в рамках первого пилотного исследования). В 2016 году в Норвегии открылся первый банк фекалий: в нем хранятся образцы экскрементов людей для трансплантации, а также использования в научных исследованиях. Елизавета Ивтушок Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2019 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. \\n Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются \\n только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения \\n и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Материалы, опубликованные в разделе «Блоги», отражают позиции их авторов, которые могут не совпадать с мнением редакции. Сайт может содержать контент, не предназначенный для лиц младше 18 лет. \\nПолитика обработки персональных данных пользователей сайта\\n \\n\\nChange privacy settings\\n \\n'" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_text = ' '.join(text)\n", "final_text" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Все здорово, только мешают отступы-переходы на новую строку `\\n`. Заменим их на пробелы с помощью метода `.replace`:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "final_text = final_text.replace('\\n', ' ')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Не прошло и двух пар, как мы разобрались со всем :) Теперь осталось совсем чуть-чуть. Написать готовую функцию для всех проделанных нами действий и применить ее в цикле для всех ссылок в списке `full_urls`. Напишем! Аргументом функции будет ссылка на новость, а возвращать она будет текст новости и всю необходимую информацию (дата, автор, сложность и проч.). Скопируем все строки кода выше." ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "def GetNews(url0):\n", " \"\"\"\n", " Returns a tuple with url0, date, author, description, title, final_text, rubrics, diff.\n", " Parameters:\n", " \n", " url0 is a link to the news (string)\n", " \"\"\"\n", " page0 = requests.get(url0)\n", " soup0 = BeautifulSoup(page0.text, 'lxml')\n", " author = soup0.find_all('meta', {'name' : 'author'})[0].attrs['content']\n", " date = soup0.find_all('meta', {'itemprop' : 'datePublished'})[0].attrs['content']\n", " title = soup0.find_all('meta', {'property' : 'og:title'})[0].attrs['content']\n", " description = soup0.find_all('meta', {'name' : 'description'})[0].attrs['content']\n", " rubrics = [r.text for r in soup0.find_all('p')[0].find_all('a')]\n", " diff = soup0.find_all('span', {'class' : 'difficult-value'})[0].text\n", " text_list = soup0.find_all('p', {'class' : None})\n", " text = [t.text for t in text_list]\n", " final_text = ' '.join(text)\n", " final_text = final_text.replace('\\n', ' ')\n", " \n", " return url0, date, author, description, title, final_text, rubrics, diff" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Уфф. Осталось применить ее в цикле. Но давайте не будем спешить: импортируем функцию `sleep` для задержки, чтобы на каждой итерации цикла, прежде чем перейти к следующей новости, Python ждал несколько секунд. Во-первых, это нужно, чтобы сайт «не понял», чтобы мы его грабим, да еще автоматически. Во-вторых, с небольшой задержкой всегда есть гарантия, что страница прогрузится (сейчас это пока не очень важно, но особенно актуально будет, когда будем обсуждать встраивание в браузер с Selenium). Приступим." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "from time import sleep" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "news = [] # это будет список из кортежей, в которых будут храниться данные по каждой новости\n", "\n", "for link in full_urls:\n", " res = GetNews(link)\n", " news.append(res)\n", " sleep(3) # задержка в 3 секунды" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Так теперь выглядит первый элемент списка:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('https://nplus1.ru/news/2019/04/09/ligo-03',\n", " '2019-04-09',\n", " 'Тимур Кешелава',\n", " 'Это произошло спустя менее 10 дней после начала нового наблюдательного этапа работы американских антенн LIGO.',\n", " 'LIGO поймала первую гравитационную волну нового сезона',\n", " 'В базе данных о регистрации гравитационных волн появилось новое событие-кандидат под номером S190408an. Это произошло спустя менее 10 дней после начала нового наблюдательного этапа работы американских антенн LIGO. На данный момент не было зафиксировано вспышки электромагнитного излучения из этого же направления — это значит, что наиболее вероятным объяснением является слияние черных дыр. 1 апреля начался новый сеанс поиска гравитационных волн на паре американских установок LIGO и европейской антенне Virgo. Обсерватории приступили к работе после обновления и повышения чувствительности, которое продолжалось в течение предыдущих 19 месяцев. Чувствительность аппаратуры существенно возросла, как и объем Вселенной, где слияния черных дыр породят заметное возмущение. Предварительные оптимистичные оценки показывали, что можно ожидать темпа регистрации на уровне одного события в неделю. Новое событие было зафиксировано в 18:18:02 по всемирному времени (21:18:02 по Москве) 8 апреля, спустя всего 8 дней после начала нового наблюдательного периода. Источник находился в районе созвездия Ящерицы, но точности и количества гравитационных антенн по-прежнему не хватает для определения направления с маленькими ошибками: область локализации с 90-процентной точностью занимает на небе площадь в 387 квадратных градусов. Оценочное расстояние до объекта составляет 1427 мегапарсек с ошибками порядка 350 мегапарсек. На данный момент нет информации о размере и массе черных дыр, но, судя по достаточно большому расстоянию и уверенному детектированию, о чем говорит высокое соотношение сигнал/шум, это были крупные тела, с массами порядка 30 солнечных. Обычные телескопы, такие как работающий в оптическом диапазоне МАСТЕР и улавливающий гамма-кванты Fermi также смотрели в данную область, но не смогли зафиксировать вспышки в указанное время. Антенны LIGO позволили впервые в истории зафиксировать гравитационные волны, о чем было объявлено в 2016 году, а в 2017 вручена Нобелевская премия по физике.\\xa0Подробнее про регистрацию гравитационных волн можно прочитать в материалах «На гребне метрического тензора», «Точилка для квантового карандаша»и «Тоньше протона». Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2019 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Материалы, опубликованные в разделе «Блоги», отражают позиции их авторов, которые могут не совпадать с мнением редакции. Сайт может содержать контент, не предназначенный для лиц младше 18 лет. Политика обработки персональных данных пользователей сайта Change privacy settings ',\n", " ['Физика', 'Астрономия'],\n", " '3.8')" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "news[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем `pandas` и создадим датафрейм из списка кортежей: " ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(news)" ] }, { "cell_type": "code", "execution_count": 30, "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", "
01234567
0https://nplus1.ru/news/2019/04/09/ligo-032019-04-09Тимур КешелаваЭто произошло спустя менее 10 дней после начал...LIGO поймала первую гравитационную волну новог...В базе данных о регистрации гравитационных вол...[Физика, Астрономия]3.8
1https://nplus1.ru/news/2019/04/09/fecal-transp...2019-04-09Елизавета ИвтушокЭффект сохранился даже через два года.Пересадка кишечного микробиома облегчила симпт...Американские ученые опубликовали результаты дв...[Медицина, Биология]2.8
\n", "
" ], "text/plain": [ " 0 1 \\\n", "0 https://nplus1.ru/news/2019/04/09/ligo-03 2019-04-09 \n", "1 https://nplus1.ru/news/2019/04/09/fecal-transp... 2019-04-09 \n", "\n", " 2 3 \\\n", "0 Тимур Кешелава Это произошло спустя менее 10 дней после начал... \n", "1 Елизавета Ивтушок Эффект сохранился даже через два года. \n", "\n", " 4 \\\n", "0 LIGO поймала первую гравитационную волну новог... \n", "1 Пересадка кишечного микробиома облегчила симпт... \n", "\n", " 5 6 \\\n", "0 В базе данных о регистрации гравитационных вол... [Физика, Астрономия] \n", "1 Американские ученые опубликовали результаты дв... [Медицина, Биология] \n", "\n", " 7 \n", "0 3.8 \n", "1 2.8 " ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Переименуем столбцы в базе." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "df.columns = ['link', 'date', 'author', 'desc', 'title', 'text', 'rubric', 'diffc']" ] }, { "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", "
linkdateauthordesctitletextrubricdiffc
0https://nplus1.ru/news/2019/04/09/ligo-032019-04-09Тимур КешелаваЭто произошло спустя менее 10 дней после начал...LIGO поймала первую гравитационную волну новог...В базе данных о регистрации гравитационных вол...[Физика, Астрономия]3.8
1https://nplus1.ru/news/2019/04/09/fecal-transp...2019-04-09Елизавета ИвтушокЭффект сохранился даже через два года.Пересадка кишечного микробиома облегчила симпт...Американские ученые опубликовали результаты дв...[Медицина, Биология]2.8
\n", "
" ], "text/plain": [ " link date \\\n", "0 https://nplus1.ru/news/2019/04/09/ligo-03 2019-04-09 \n", "1 https://nplus1.ru/news/2019/04/09/fecal-transp... 2019-04-09 \n", "\n", " author desc \\\n", "0 Тимур Кешелава Это произошло спустя менее 10 дней после начал... \n", "1 Елизавета Ивтушок Эффект сохранился даже через два года. \n", "\n", " title \\\n", "0 LIGO поймала первую гравитационную волну новог... \n", "1 Пересадка кишечного микробиома облегчила симпт... \n", "\n", " text rubric \\\n", "0 В базе данных о регистрации гравитационных вол... [Физика, Астрономия] \n", "1 Американские ученые опубликовали результаты дв... [Медицина, Биология] \n", "\n", " diffc \n", "0 3.8 \n", "1 2.8 " ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь внесем изменения: сделаем столбец `diffc` числовым – типа *float*." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "df['diffc'] = df['diffc'].astype(float)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь сложность представлена в базе как количественный показатель, и описывать её можно соответствующим образом:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 29.000000\n", "mean 4.186207\n", "std 1.555801\n", "min 1.800000\n", "25% 3.100000\n", "50% 3.900000\n", "75% 5.500000\n", "max 7.100000\n", "Name: diffc, dtype: float64" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.diffc.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь столбец со сложностью точно числовой. Можем даже построить для него гистограмму." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "df.diffc.plot.hist()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Объединим рубрики в *text* в одну строку через запятую:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "df['rubric'] = [','.join(r) for r in df.rubric]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Давайте почистим текст новостей – уберем оттуда текст, не относящийся к новостям. Найдем лишнее:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'В базе данных о регистрации гравитационных волн появилось новое событие-кандидат под номером S190408an. Это произошло спустя менее 10 дней после начала нового наблюдательного этапа работы американских антенн LIGO. На данный момент не было зафиксировано вспышки электромагнитного излучения из этого же направления — это значит, что наиболее вероятным объяснением является слияние черных дыр. 1 апреля начался новый сеанс поиска гравитационных волн на паре американских установок LIGO и европейской антенне Virgo. Обсерватории приступили к работе после обновления и повышения чувствительности, которое продолжалось в течение предыдущих 19 месяцев. Чувствительность аппаратуры существенно возросла, как и объем Вселенной, где слияния черных дыр породят заметное возмущение. Предварительные оптимистичные оценки показывали, что можно ожидать темпа регистрации на уровне одного события в неделю. Новое событие было зафиксировано в 18:18:02 по всемирному времени (21:18:02 по Москве) 8 апреля, спустя всего 8 дней после начала нового наблюдательного периода. Источник находился в районе созвездия Ящерицы, но точности и количества гравитационных антенн по-прежнему не хватает для определения направления с маленькими ошибками: область локализации с 90-процентной точностью занимает на небе площадь в 387 квадратных градусов. Оценочное расстояние до объекта составляет 1427 мегапарсек с ошибками порядка 350 мегапарсек. На данный момент нет информации о размере и массе черных дыр, но, судя по достаточно большому расстоянию и уверенному детектированию, о чем говорит высокое соотношение сигнал/шум, это были крупные тела, с массами порядка 30 солнечных. Обычные телескопы, такие как работающий в оптическом диапазоне МАСТЕР и улавливающий гамма-кванты Fermi также смотрели в данную область, но не смогли зафиксировать вспышки в указанное время. Антенны LIGO позволили впервые в истории зафиксировать гравитационные волны, о чем было объявлено в 2016 году, а в 2017 вручена Нобелевская премия по физике.\\xa0Подробнее про регистрацию гравитационных волн можно прочитать в материалах «На гребне метрического тензора», «Точилка для квантового карандаша»и «Тоньше протона». Нашли опечатку? Выделите фрагмент и нажмите Ctrl+Enter. Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности Коэффициент сложности © 2019 N+1 Интернет-издание \\xa0 Свидетельство о регистрации СМИ Эл № ФС77-67614 Использование всех текстовых материалов без изменений в некоммерческих целях разрешается со ссылкой на N+1. Все аудиовизуальные произведения являются собственностью своих авторов и правообладателей и используются только в образовательных и информационных целях. Если вы являетесь собственником того или иного произведения и не согласны с его размещением на нашем сайте, пожалуйста, напишите на kirill@nplus1.ru Материалы, опубликованные в разделе «Блоги», отражают позиции их авторов, которые могут не совпадать с мнением редакции. Сайт может содержать контент, не предназначенный для лиц младше 18 лет. Политика обработки персональных данных пользователей сайта Change privacy settings '" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.text[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Лишний текст находится после фразы 'Нашли опечатку?'. Так давайте будем разбивать строки по этой фразе с помощью метода `.split()` и брать все, что до нее (элемент с индексом 0)." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "df['clean_text'] = [t.split('Нашли опечатку?')[0] for t in df.text]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Осталось только заменить непонятные символы `\\xa0` на пробелы:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "df['clean_text'] = [t.replace(\"\\xa0\", \" \") for t in df.clean_text]" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'В базе данных о регистрации гравитационных волн появилось новое событие-кандидат под номером S190408an. Это произошло спустя менее 10 дней после начала нового наблюдательного этапа работы американских антенн LIGO. На данный момент не было зафиксировано вспышки электромагнитного излучения из этого же направления — это значит, что наиболее вероятным объяснением является слияние черных дыр. 1 апреля начался новый сеанс поиска гравитационных волн на паре американских установок LIGO и европейской антенне Virgo. Обсерватории приступили к работе после обновления и повышения чувствительности, которое продолжалось в течение предыдущих 19 месяцев. Чувствительность аппаратуры существенно возросла, как и объем Вселенной, где слияния черных дыр породят заметное возмущение. Предварительные оптимистичные оценки показывали, что можно ожидать темпа регистрации на уровне одного события в неделю. Новое событие было зафиксировано в 18:18:02 по всемирному времени (21:18:02 по Москве) 8 апреля, спустя всего 8 дней после начала нового наблюдательного периода. Источник находился в районе созвездия Ящерицы, но точности и количества гравитационных антенн по-прежнему не хватает для определения направления с маленькими ошибками: область локализации с 90-процентной точностью занимает на небе площадь в 387 квадратных градусов. Оценочное расстояние до объекта составляет 1427 мегапарсек с ошибками порядка 350 мегапарсек. На данный момент нет информации о размере и массе черных дыр, но, судя по достаточно большому расстоянию и уверенному детектированию, о чем говорит высокое соотношение сигнал/шум, это были крупные тела, с массами порядка 30 солнечных. Обычные телескопы, такие как работающий в оптическом диапазоне МАСТЕР и улавливающий гамма-кванты Fermi также смотрели в данную область, но не смогли зафиксировать вспышки в указанное время. Антенны LIGO позволили впервые в истории зафиксировать гравитационные волны, о чем было объявлено в 2016 году, а в 2017 вручена Нобелевская премия по физике. Подробнее про регистрацию гравитационных волн можно прочитать в материалах «На гребне метрического тензора», «Точилка для квантового карандаша»и «Тоньше протона». '" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.clean_text[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Всё! Сохраняем датафрейм в файл. Для разнообразия сохраним в Excel:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "df.to_excel('nplus-news.xlsx')" ] } ], "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.8" } }, "nbformat": 4, "nbformat_minor": 2 }