Семинары ведут: Щуров И.В., Будылин Р.Я., НИУ ВШЭ
Данный notebook является набором задач по курсу «Программирование на языке Python для сбора и анализа данных» (НИУ ВШЭ, 2014-15). Распространяется по лицензии CC BY-SA 4.0. На странице курса находятся другие материалы.
За разные задачи можно получить разное число баллов. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы набрать 6 баллов, чтобы подстраховаться.
Для предварительной проверки задания нужно скачать данный ipynb
-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. здесь) и вставить решение каждой задачи в ячейку для кода, следующую за его условием, запустить эту ячейку, а затем запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.
Чтобы сдать ДЗ, его надо будет загрузить в nbgr-x в виде ipynb
-файла.
Во всех задачах можно использовать библиотеки requests
и BeautifulSoup
(bs4
).
Написать функцию any_news_about_harry(url)
, принимающую на вход адрес веб-страницы url
, загружающую эту веб-страницу и проверяющую, встречается ли в ней слово Harry
(с большой буквы). Функция должна возвращать True
, если встречается, и False
в противном случае. Также функция должна возвращать False
, если страницу не удалось открыть (например, была получена ошибка 404 Not Found.)
# YOUR CODE HERE
raise NotImplementedError()
assert any_news_about_harry("https://en.wikipedia.org/w/index.php?title=J._K._Rowling&oldid=694008857")
assert any_news_about_harry("https://en.wikipedia.org/w/index.php?title=Star_Wars&oldid=694701430")
assert not any_news_about_harry("https://en.wikipedia.org/w/index.php?title=Darth_Vader&oldid=694617684")
assert not any_news_about_harry("http://math-info.hse.ru/there_is_no_Harry_here")
Написать функцию get_strong(html)
, принимающую на вход html-страницу в виде длинной строки, записанной в переменную html
, и возвращающую строчку, содержащуюся в первом теге strong
.
Примеры см. в тестах.
Подсказка. Вы можете создать объект BeautifulSoup
, передав ему строку с html в качестве параметра. Например:
from bs4 import BeautifulSoup
page = BeautifulSoup("<html><body><p>Hello</p></body></html>", "html.parser")
print(page.p)
# YOUR CODE HERE
raise NotImplementedError()
assert get_strong("<html><body><p>Hello, <strong>World</strong>!") == "World"
html = """<html>
<body>
<p>
Hello,
<strong>
World
</strong>
</p>
</body>
</html>"""
assert get_strong(html).strip() == "World"
assert get_strong("<html><body><p>tag <strong> is used in HTML\n to make letters <strong>stronger</strong>") == "stronger"
assert get_strong("<html><body><strong>One\nTwo</strong></body></html>") == "One\nTwo"
Для вставки картинок в HTML используется тег <img>
, содержащий параметр src
— адрес файла с картинкой. Например, <img src="https://upload.wikimedia.org/wikipedia/commons/b/bd/Struthio_camelus_portrait_Whipsnade_Zoo.jpg"/>
. Написать функцию all_images_src(html)
, принимающую на вход длинную строчку с HTML-документом, а возвращающую список адресов всех картинок, встречающихся в этом документе (в том порядке, в котором они встречаются в документе).
# YOUR CODE HERE
raise NotImplementedError()
assert all_images_src('<html><body><img src="https://upload.wikimedia.org/wikipedia/commons/b/bd/Struthio_camelus_portrait_Whipsnade_Zoo.jpg"/>') == ["https://upload.wikimedia.org/wikipedia/commons/b/bd/Struthio_camelus_portrait_Whipsnade_Zoo.jpg"]
assert all_images_src( ('<html><body><IMG src="test.jpg">\n'
'<p>Some text\n'
'<img SRC=\'well.png\'>\n'
'</p></body></html>') ) == ["test.jpg", "well.png"]
assert all_images_src('<html><body><p><a href="link.html">'
'<img alt="Just a test image" src="this is a test.jpg"><ul>' + "\n"
.join("<li><img src='img%04i.png'></li>" % i for i in range(1000)) +
"</ul></p></body></html>"
) == ['this is a test.jpg'] + ['img%04i.png' % i for i in range(1000)]
Написать функцию get_all_headings(url)
, принимающую на вход адрес страницы в Википедии и возвращающую список, состоящий из названий разделов статьи (в порядке появления в статье). Если такой страницы не существует, функция должна вернуть список, состоящей из строки "Not found"
.
# YOUR CODE HERE
raise NotImplementedError()
from urllib.parse import urlencode
entrypoint = "https://ru.wikipedia.org/w/index.php?"
def mkurl(title, oldid):
return entrypoint+urlencode(dict(title=title, oldid=oldid))
assert get_all_headings(mkurl("Северовирджинская кампания",75043192)) == ['Предыстория',
'Силы сторон',
'Сражения',
'Последствия',
'Примечания',
'Литература',
'Ссылки']
assert get_all_headings(mkurl('User:Ilya_Voyager/sandbox/h2test',"75055744")) == ['Заголовок', 'Ещё один заголовок', 'Третий заголовок']
assert get_all_headings(mkurl('User:Ilya_Voyager/This Page Will Never Exist', "")) == ["Not found"]
del urlencode, mkurl
Написать функцию city_site(name)
, принимающую на вход название города и возвращающую строку, содержащую адрес официального сайта этого города, согласно русской Википедии. Если такого города Википедия не знает, или если у города нет сайта, вернуть None
.
Предполагается, что вы будете решать эту задачу, обрабатывая HTML-код веб-страницы, а не исходный код статей, и не будете пользоваться сторонними библиотеками (кроме urllib
, requests
, BeautifulSoup
).
Подсказка. Как сформировать адрес страницы, зная название статьи, можно подсмотреть в тесте к задаче 4. Впрочем, можно передать адрес страницы напрямую в requests.get
, см. официальную документацию.
# YOUR CODE HERE
raise NotImplementedError()
res = [('Абакан', 'http://абакан.рф/'),
('Анадырь', None),
('Киров (Кировская область)', 'http://www.mo-kirov.ru'),
('Южно-Сахалинск', 'http://yuzhno-sakh.ru/'),
('Усть-Каменоустюгск', None)]
for city, site in res:
assert city_site(city) == site