Skip to content

Olga0502/xmljson

This branch is 6 commits ahead of railbotan/xmljson:main.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Dec 12, 2021
161b985 · Dec 12, 2021

History

16 Commits
Dec 12, 2021
Dec 12, 2021
Dec 12, 2021
Dec 12, 2021
Nov 28, 2021
Nov 28, 2021
Dec 12, 2021
Dec 12, 2021

Repository files navigation

XML

Некоторые сайты все еще поддерживают самое простое API к своим новостям в формате XML: RSS-фиды.

Например, RSS Lenta.ru доступен по адресу: https://lenta.ru/rss

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <language>ru</language>
    <title>Lenta.ru : Новости</title>
    <description>Новости, статьи, фотографии, видео. Семь дней в неделю, 24 часа в сутки.</description>
    <link>https://lenta.ru</link>
    <image>
      <url>https://lenta.ru/images/small_logo.png</url>
      <title>Lenta.ru</title>
      <link>https://lenta.ru</link>
      <width>134</width>
      <height>22</height>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="http://lenta.ru/rss"/>
<item>
  <guid>https://lenta.ru/news/2021/11/28/saakashvili/</guid>
  <author>Алевтина Запольская</author>
  <title>Врачи диагностировали у Саакашвили ПТСР</title>
  <link>https://lenta.ru/news/2021/11/28/saakashvili/</link>
  <description>

Считать дерево элементов можно, например, вот так:

import xml.etree.ElementTree as ET
from urllib.request import urlopen

data = urlopen('https://lenta.ru/rss').read().decode('utf8')
root = ET.fromstring(data)

Сами новости хранятся в элементах channel/item.

<item>
  <guid>https://lenta.ru/news/2021/11/28/fake/</guid>
  <author>Степан Костецкий</author>
  <title>Канадская чиновница оказалась ненастоящим аборигеном и потеряла работу</title>
  <link>https://lenta.ru/news/2021/11/28/fake/</link>
  <description>
    <![CDATA[Канадская чиновница в области здравоохранения Кэрри Бурасса, эксперт по здоровью коренного населения и профессор института, занимающегося соответствующими исследованиями, оказалась ненастоящим аборигеном и потеряла работу. Она заявляла, что принадлежит к канадским метисам, но это оказалось ложью.]]>
  </description>
  <pubDate>Sun, 28 Nov 2021 20:17:00 +0300</pubDate>
  <enclosure url="https://icdn.lenta.ru/images/2021/11/28/19/20211128194927643/pic_cc5f23c3e6478a543d384b86578881d2.jpeg" type="image/jpeg" length="43556"/>
  <category>Мир</category>
</item>

1

Создайте JSON с заголовками и датами пуликации новостей. Сохраните его на диске как news.json.

У файла будет такая структура:

[{'pubDate': 'Sun, 28 Nov 2021 20:56:39 +0300',
  'title': 'Совбез Белоруссии заявил о возможном заочном суде над '
           'оппозиционерами'},
 {'pubDate': 'Sun, 28 Nov 2021 20:45:53 +0300',
  'title': 'Футболист «Рубина» сломал ногу в матче РПЛ с «Динамо»'},
 {'pubDate': 'Sun, 28 Nov 2021 20:29:00 +0300',
  'title': 'Врачи диагностировали у Саакашвили ПТСР'},

Помните, что JSON хоть и очень похож и почти совместим с словарем в Питоне, это разные форматы, и для конвертации надо использовать модуль json. При сохранении указывайте кодировку utf8.

2

Сделайте подобный JSON, только с текстовым содержимым всех тегов внутри item, не перечисляя их, а перебирая потомков xml-узла.

 {'author': 'Евгения Черкасова',
  'category': 'Мир',
  'description': '\n'
                 '    Пресс-секретарь президента РФ Дмитрий Песков в ходе '
                 'видеоконференции с журналистами рассказал о надеждах на '
                 'скорую встречу Байдена и Путина. По словам Пескова, общение '
                 'глав государств пройдет в формате видеоконференции. Он '
                 'добавил, что дата встречи еще не выбрана, но в Кремле '
                 'надеются, что она состоится до конца года.\n'
                 '  ',
  'enclosure': None,
  'guid': 'https://lenta.ru/news/2021/11/28/vstrecha/',
  'link': 'https://lenta.ru/news/2021/11/28/vstrecha/',
  'pubDate': 'Sun, 28 Nov 2021 20:27:00 +0300',
  'title': 'В Кремле понадеялись на встречу Байдена и Путина до нового года'}

API, ДЗ

Познакомимся с примером публичного API на примере с данными из Википедии. Отметим, что у Википедии регулярно генерируются общедоступные базы данных, поэтому если необходим массовый скрепинг и парсинг, лучше получить доступ к исходному дампу.

Все страницы в Википедии версионируются, поэтому можно посмотреть на историю правок.

Сделаем это на примере страницы об Александре Градском.

Посмотрим последние 500 правок.

Извлечем информацию о последней (самой свежей) правке:

from urllib.request import urlopen
from json import loads


url = 'https://ru.wikipedia.org/w/api.php?action=query&format=json&prop=revisions&rvlimit=500&titles=%D0%93%D1%80%D0%B0%D0%B4%D1%81%D0%BA%D0%B8%D0%B9,_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80_%D0%91%D0%BE%D1%80%D0%B8%D1%81%D0%BE%D0%B2%D0%B8%D1%87'
data = loads(urlopen(url).read().decode('utf8'))
print(data['query']['pages']['183903']['revisions'][0])
{
  'revid': 118174295, 
  'parentid': 118174211,
  'user': '91.76.190.223',
  'anon': '', 
  'timestamp': '2021-11-28T16:48:39Z', 
  'comment': ''
}

При помощи groupby из itertools выведите статистику по количеству правок в следующем виде:

2021-11-28 142
2021-11-27 5
2021-11-26 9
2021-11-24 1
2021-11-16 1
2021-11-15 2
2021-11-14 1
...

Попробуйте соотнести всплески правок с событиями, связанными с Градским.

Корреляция

Определите дату смерти Жан-Поля Бельмондо, найдя дату с самым большим количеством правок за последнее время в статье о нем. Можно ли пользоваться такой метрикой?

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%