Видеокурс выложен на сайте Altube.ru вместо Youtube и плеер Altube не поддерживает субтитры. Прошу решить вопрос о предоставлении русских субтитров в этом англоязычном видеокурсе. |
Сетевые программы
23.3. Получение веб-страниц с использованием библиотеки urllib
Библиотека urllib максимально упрощает получение веб-страниц и обработку их содержимого в программах Питона. Используя urllib, мы работаем с веб-страницами почти так же, как с файлами. Нужно всего лишь указать, какую веб-страницу мы хотим получить, дальше уже сама библиотека urllib отрабатывает все детали протокола HTTP.
Эквивалентный код для чтения файла romeo.txt из сети с помощью urllib записывается следующим образом:
import urllib fhand = urllib.urlopen('http://www.py4inf.com/code/romeo.txt') for line in fhand: print line.strip()
После того, как веб-страница открыта с помощью метода urllib.urlopen, можно работать с ней как с файлом, читая ее содержимое в цикле for. На выходе программа выдает только содержимое файла. Заголовочная информация также пересылается, но код библиотеки urllib проглатывает заголовки и возвращает нам только данные:
But soft what light through yonder window breaks It is the east and Juliet is the sun Arise fair sun and kill the envious moon Who is already sick and pale with grief
Для примера можно написать программу, получающую содержимое файла romeo.txt и подсчитывающую частоту каждого слова в тексте:
import urllib counts = dict() fhand = urllib.urlopen('http://www.py4inf.com/code/romeo.txt') for line in fhand: words = line.split() for word in words: counts[word] = counts.get(word,0) + 1 print counts
Еще раз: как только мы открыли веб-страницу, можно читать ее точно так же, как и локальный файл на компьютере.
23.4. Разбор HTML и извлечение информации из веб-страниц (Web scraping)
Очень часто возможности библиотеки urllib Питона используются при извлечении информации во всемирной паутине (Web scraping). Мы пишем программу, которая притворяется веб-браузером, получает Интернет-страницы и затем анализирует их содержимое, находя в них нужные текстовые шаблоны.
Например, поисковая машина, подобная Google, начинает свою работу с какой-нибудь веб-страницы, извлекает из нее ссылки на другие страницы, получает по сети содержимое этих страниц, извлекает из них ссылки и так далее. Используя подобную технику, пауки Google прокладывают свой путь практически через все страницы в сети. Google принимает частоту найденных подобным образом ссылок на конкретную веб-страницу как меру "важности" этой страницы, определяющую, насколько высоко она будет помещена в ответах на поисковые запросы.
23.5. Разбор HTML-страниц с помощью регулярных выражений
Один из самых простых способов анализа HTML-страниц – использование регулярных выражений для поиска и извлечения подстрок, соответствующих определенным шаблонам. Рассмотрим простейшую веб-страницу:
<h1>The First Page</h1> <p> If you like, you can switch to the <a href="http://www.dr-chuck.com/page2.htm"> Second Page</a>. </p>
Можно построить регулярное выражение для нахождения и извлечения ссылок из приведенного выше текста:
href="http://.+?"
Это регулярное выражение соответсвует подстрокам, начинающимся с фрагмента "href="http://", за которым следует один или несколько произвольных символов ".+?" и далее закрывающая двойная кавычка. Вопросительный знак после плюса в ".+?" указывает, что сопоставление подстроки шаблону должно происходить в "нежадном" режиме вместо используемого по умолчанию "жадного". При "нежадном" сопоставлении мы пытаемся найти максимально короткую строку, соответствующую шаблону, при "жадном" – максимально длинную. Нужно еще добавить круглые скобки в наше регулярное выражение, чтобы указать, какую часть сопоставленной шаблону строки мы хотим извлечь. В результате получим следующую программу:
import urllib import re url = raw_input('Enter - ') html = urllib.urlopen(url).read() links = re.findall('href="(http://.*?)"', html) for link in links: print link
Метод findall из библиотеки работы с регулярными выражениями возвращает нам список всех подстрок, соответствующих нашему регулярному выражению, причем для каждой такой подстроки выдается только ее часть, заключенная между двумя двойными кавычками.
В результате работы программы получим:
python urlregex.py Enter - http://www.dr-chuck.com/page1.htm http://www.dr-chuck.com/page2.htm python urlregex.py Enter - http://www.py4inf.com/book.htm http://www.greenteapress.com/thinkpython/thinkpython.html http://allendowney.com/ http://www.py4inf.com/code http://www.lib.umich.edu/espresso-book-machine http:// www.py4inf.com/py4inf-slides.zip
Регулярные выражения прекрасно работают, когда HTML-текст правильно и предсказуемо отформатирован. Но, поскольку в сети огромное количество не вполне корректных страниц (формат HTML не является строгим), программа, основанная лишь на регулярных выражениях, либо пропускает некоторые допустимые ссылки, либо выдает неправильные данные. Эта проблема может быть решена путем использования библиотеки для надежного разбора HTML.